Linq多条件查询优化---使用扩展方法
2014-10-23 12:59
337 查看
写在算法前:最近在做SQL多条件查询,感觉自己写查询逻辑太过麻烦。比如,假如有一个查询条件,就需要分析两种情况(空条件和一个条件);两个条件就要四中情况;三个条件,8种情况.......
这样是不是也太麻烦了?!下面这种方法可以为你简化很多步骤,一起来看看吧。。。
1,首先你要自定义两个方法(这里封装到类里):
public static class MyHelper
{
//查询方法
public List<User> AjaxSeniorSearchUser(string userName, string nickName, string ddlClasses)
{
List<User> eqList = new List<User>();
Expression<Func<User, bool>> predicate = p => 1 == 1;
if (userName == "" && nickName == "" && ddlClasses == "0")
{
predicate = predicate.And(p => 1 == 1);
}
else
{
if (userName != "")
{
predicate = predicate.And(p => p.UserName.Contains(userName.Trim()));
}
if (nickName != "")
{
predicate = predicate.And(p => p.NickName.Contains(nickName.Trim()));
}
if (ddlClasses != "0")
{
int tempClass=int.Parse(ddlClasses);
predicate = predicate.And(p => p.ClassID ==tempClass );
}
}
return SeachBodyFunction(eqList, predicate);
}
//查询的主方法
private List<User> SeachBodyFunction(List<User> eqList, Expression<Func<User, bool>> predicate)
{
var User = db.User.Where(predicate).Join(db.User, u => u.TeacherID, r => r.ID, (u, r) => new
{
ID = u.ID,
UserName = u.UserName,
NickName = u.NickName,
//ClassName = u.ClassName,
Sex = u.Sex,
TeacherID = u.ID,
TeacherName = r.NickName,
PracticeCompany = u.PracticeCompany,
Flow = u.Flow
}).ToList();
foreach (var eq in User)
{
User UserFo = new User();
UserFo.ID=eq.ID;
UserFo.UserName=eq.UserName;
UserFo.NickName=eq.NickName;
UserFo.SexName = EnumTool.GetSex(eq.Sex.Value);
UserFo.TeacherID=eq.TeacherID;
UserFo.TeacherName=eq.TeacherName;
UserFo.PracticeCompany=eq.PracticeCompany;
UserFo.Flow = eq.Flow;
eqList.Add(UserFo);
}
return eqList;
}
},
2,然后要自定义一个扩展方法:
namespace MyProject.Tool
{
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.Compose(second, Expression.And);
}
}
3,主函数调用示例:
首先别忘记引用Tool,
using MyProject.Tool;
public ActionResult StudentIndex(string userName, string nickName, string ddlClasses)//这里实在MVC下的示例,如果是别的,换成相应的调用函数就行了
{
List<User> userList=AjaxSeniorSearchUser(userName, nickName, ddlClasses);//至此,你已经得到查询出来的集合了
return View(userList);
}
完结----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面的(你可以完全不用看了)
4,前台页面显示示例
<table>
@foreach (var item in Model)
{
<tr>
<td>
<input name='checkItem' type="checkbox" value="@item.ID" /></td>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
<td>
@Html.DisplayFor(modelItem => item.NickName)
</td>
&n
4000
bsp; <td>
@Html.DisplayFor(modelItem => item.ClassName)
</td>
<td>
@Html.DisplayFor(modelItem => item.SexName)
</td>
<td>
@Html.DisplayFor(modelItem => item.PracticeCompany)
</td>
<td>
@Html.DisplayFor(modelItem => item.TeacherName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Flow)
</td>
</tr>
}
</table>
这样是不是也太麻烦了?!下面这种方法可以为你简化很多步骤,一起来看看吧。。。
1,首先你要自定义两个方法(这里封装到类里):
public static class MyHelper
{
//查询方法
public List<User> AjaxSeniorSearchUser(string userName, string nickName, string ddlClasses)
{
List<User> eqList = new List<User>();
Expression<Func<User, bool>> predicate = p => 1 == 1;
if (userName == "" && nickName == "" && ddlClasses == "0")
{
predicate = predicate.And(p => 1 == 1);
}
else
{
if (userName != "")
{
predicate = predicate.And(p => p.UserName.Contains(userName.Trim()));
}
if (nickName != "")
{
predicate = predicate.And(p => p.NickName.Contains(nickName.Trim()));
}
if (ddlClasses != "0")
{
int tempClass=int.Parse(ddlClasses);
predicate = predicate.And(p => p.ClassID ==tempClass );
}
}
return SeachBodyFunction(eqList, predicate);
}
//查询的主方法
private List<User> SeachBodyFunction(List<User> eqList, Expression<Func<User, bool>> predicate)
{
var User = db.User.Where(predicate).Join(db.User, u => u.TeacherID, r => r.ID, (u, r) => new
{
ID = u.ID,
UserName = u.UserName,
NickName = u.NickName,
//ClassName = u.ClassName,
Sex = u.Sex,
TeacherID = u.ID,
TeacherName = r.NickName,
PracticeCompany = u.PracticeCompany,
Flow = u.Flow
}).ToList();
foreach (var eq in User)
{
User UserFo = new User();
UserFo.ID=eq.ID;
UserFo.UserName=eq.UserName;
UserFo.NickName=eq.NickName;
UserFo.SexName = EnumTool.GetSex(eq.Sex.Value);
UserFo.TeacherID=eq.TeacherID;
UserFo.TeacherName=eq.TeacherName;
UserFo.PracticeCompany=eq.PracticeCompany;
UserFo.Flow = eq.Flow;
eqList.Add(UserFo);
}
return eqList;
}
},
2,然后要自定义一个扩展方法:
namespace MyProject.Tool
{
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.Compose(second, Expression.And);
}
}
3,主函数调用示例:
首先别忘记引用Tool,
using MyProject.Tool;
public ActionResult StudentIndex(string userName, string nickName, string ddlClasses)//这里实在MVC下的示例,如果是别的,换成相应的调用函数就行了
{
List<User> userList=AjaxSeniorSearchUser(userName, nickName, ddlClasses);//至此,你已经得到查询出来的集合了
return View(userList);
}
完结----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面的(你可以完全不用看了)
4,前台页面显示示例
<table>
@foreach (var item in Model)
{
<tr>
<td>
<input name='checkItem' type="checkbox" value="@item.ID" /></td>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
<td>
@Html.DisplayFor(modelItem => item.NickName)
</td>
&n
4000
bsp; <td>
@Html.DisplayFor(modelItem => item.ClassName)
</td>
<td>
@Html.DisplayFor(modelItem => item.SexName)
</td>
<td>
@Html.DisplayFor(modelItem => item.PracticeCompany)
</td>
<td>
@Html.DisplayFor(modelItem => item.TeacherName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Flow)
</td>
</tr>
}
</table>
相关文章推荐
- [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
- linq 动态拼接查询条件 扩展方法
- 用扩展方法优化多条件查询(不定条件查询)
- 使用Enumerable.OfType<T>扩展方法实现非泛型集合的Linq查询
- linq 动态拼接查询条件 扩展方法
- 用扩展方法优化多条件查询(不定条件查询)
- (转)用扩展方法优化多条件查询
- 使用表达式树动态构建Linq查询条件来实现单个实体动态查询
- asp.net MVC + linq to Entity简单教程(四)linq to Entity查询中其它方法的使用
- 让存储过程中的查询语句按照不同查询条件进行优化(即每次查询都使用参数option(recompile))
- 单表多条件查询,匿名类型,匿名对象,嵌套查询,Linq序列转换后调用外部方法
- LINQ to Entities查询的简便方法就是使用函数
- 多条件数据库查询的优化方法
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- 使用Limit参数优化MySQL查询的方法
- MySQL中使用case when 语句实现多条件查询的方法
- LINQ学习笔记(三)之LINQ to SQL 查询语句使用方法一
- [转自JeffreyZhao]在LINQ to SQL中使用Translate方法以及修改查询用SQL
- 使用Python读取TestTrack记录- Part3 动态生成Linq to xml查询语句筛选条件
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL (转)