寫在算法前:最近在做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>
<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>