Linq多條件查詢優化---使用擴展方法

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章