Linq多条件查询优化---使用扩展方法

本文介绍了一种简化SQL多条件查询的方法,通过自定义类和扩展方法,实现查询逻辑的清晰化,减少重复代码,提升代码可读性和维护性。包括封装查询方法、定义扩展方法以及主函数调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值