Where子句有多个未知条件我目前正在为我的公司开发一个员工管理系统。这些字段可能会不时变化,因此我为每个字段都有一个接口,如下所示:publicinterfaceIstaffinfoField{//...//...}对于每个字段,我都实现了Filter方法,例如使用名称:classNameStaffInfoField:BaseStaffInfoField{//...包含(pAdditionalData));}//...}现在用户想要使用多个条件进行搜索,这很简单,我只需循环遍历列表并调用Filter。但是,他们还需要一个OR条件(例如姓名为A,OR姓名为B,AND部门名称为C,或员工年龄为30岁)。注意:用户是最终用户,他们通过组合框和文本框输入搜索查询。我能以某种方式修改我的模式或lambda表达式吗?因为在整个过程中,我并没有将原始列表保存为Unionit'sOR条件。我认为如果我保存表达式并将其组合为OR条件,它会很慢。我现在能想到的唯一解决方案是向需要原始SQLWHERE语句的接口添加一个方法。但是我整个程序还没有使用纯SQL查询,现在使用它不好吗?您可以下载Albahari的LINQKit。它包含一个PredicateBuilder,除其他有用的功能外,它允许您以动态方式将LINQ表达式与OR连接起来。varpredicate=PredicateBuilder.False();predicate=predicate.Or(s=>s.Name.Contains(data));predicate=predicate.Or(s=>s.Age>30);返回dataContext.Staff.Where(谓词);您也可以下载源代码,看看它是如何实现的。由于您的方法返回一个IQueryable,客户已经可以将它用于任意复杂的查询。IQueryable结果=xxx.Filter(....);结果=result.Where(...);if(...)result=result.Where(s=>(s.Age>30||s.SalaryIQueryable非常灵活。当你开始枚举结果时,查询树被评估并转换为sql。我只是想知道你为什么需要这个接口?!因为你的Filter方法需要IQueryable,这意味着客户端已经有IQueryable!如果她自己已经可以应用任意复杂的查询运算符,她为什么要调用你的Filter方法?编辑:在你的额外解释之后,如果我如果你是我,我会为用户创建一个简单的界面,让他们自己创建包含OR和AND子句的查询树,并创建一个简单的函数,将用户查询树转换为linq表达式树。换句话说,不要让最终用户在linq查询树级别工作,它太抽象了,而且允许用户接触如此低级别的代码层太危险了。但是手动转换为linq树的抽象树听起来既安全又容易。如果您的用户是最终用户,并且他们通过UI输入条件,您可能需要查看支持IQueryable的UI控件。Telerik有大量的预烘焙控件。在大多数情况下,最终用户与网格交互并将过滤器应用于列。还有其他几家供应商也在做同样的事情。第二个或者,如果您想过不去,您可以获取用户提供的输入文本,将其解析为表达式树,然后将该表达式树映射到IQueryable。如果您不熟悉解析器,这个任务将很容易很难实现。以上就是C#学习教程的全部内容:Where子句有多个未知条件。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
