如何在LinqToSql查询中重用Where子句他们在文本框中键入搜索词,然后通过将多个字段与搜索词匹配来搜索记录。我的查询看起来像:varresults=fromrecordinDataContext.Recordswhererecord.Field1.ToLower().Contains(term)||record.Field2.ToLower().Contains(术语)||record.Field3.ToLower().Contains(term)选择记录;我有很多使用相同过滤器的查询,所以我想提取过滤器以便重复使用。类似于:varfilter=newFunc((record,term)=>record.Field1.ToLower().Contains(term)||record.Field2.ToLower().Contains(term)||record.Field3.ToLower().包含(术语));varresults=fromrecordinDataContext.Recordswherefilter(record,term)选择记录;但是,它不起作用,因为:方法'System.ObjectDynamicInvoke(System.Object[])'不支持SQL转换。如何跨查询重用wherewhere条件?使用编译查询!varfilter=CompiledQuery.Compile((DatabaseDataContextdc,Recordrecord,stringterm)=>record.Field1.ToLower().Contains(term)||record.Field2.ToLower().Contains(term)||record.Field3.ToLower().Contains(术语));varresults=fromrecordinDataContext.Recordswherefilter(DataContext,record,term)选择记录;有关详细信息,请参阅如何:存储和重用查询。您需要构建表达式而不是函数:Expression>filter=record=>record.Field1.ToLower().Contains(term);//restomittedlambdaexpression保持不变,但你需要将它返回到Expression>类型的变量中——这将使C#编译器将其编译为表达式而不是委托,从而允许将其传递给LINQtoSQL。但是,您将无法将表达式变量与C#语法的where子句一起使用:您需要使用Where扩展方法:varresults=DataContext.Records.Where(filter);编辑添加:如果您希望能够在不同条件之间进行过滤要在上创建过滤器,您只需要一种方法来从术语生成表达式:privatestaticExpression>Filter(stringterm){returnr=>r.Field1.ToLower().Contains(术语);}varresults=DataContext.Records.Where(Filter(term));如果你现在想将过滤器保持为lambda,你可以这样做,但泛型有点嵌套:Func>>filter=term=>(r=>r.Field1.ToLower().Contains(term));varresults=DataContext.Records.Where(filter(term));无论如何,重要的是Where子句中的内容必须是一个Expression>-但如上所示,您可以动态构造适当的表达式,使表达式依赖于term。如果您在Where子句中指定过滤器,这正是LINQtoSQL所做的。除了其他人指出的Expression>问题外,我还建议查看PredicateBuilder。这对于动态组合lambda表达式很有用。我认为你需要让它成为Expression>。否则,它会尝试将实际的C#方法调用转换为SQL而不是其描述。不能保证与此版本一起使用;我不确定哪些字符串函数会转换为SQL。以上就是C#学习教程:HowtoreusethewhereclauseintheLinqToSqlquery的全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
