如何在C#的LINQ查询中添加自定义字符串条件?
解决LINQ查询中添加动态条件的问题
首先明确:你不能直接把字符串形式的条件拼进LINQ查询里。因为LINQ(尤其是EF的LINQ to Entities)是基于表达式树工作的,它会把C#表达式转换成数据库可执行的SQL,字符串形式的代码无法被编译器解析,还会带来SQL注入风险。
给你两种可行的解决方案:
方案一:直接写进Where条件(最推荐)
你的字符串条件本质是固定的C#逻辑,直接把它加到原查询的Where子句里即可,编译时还能做语法检查:
var OnePoste = from cr in bd.Staxe where cr.Date_Comm >= dateTime1 && cr.Date_Comm <= dateTime2 && (coutCommInt1 == 0 || cr.Mt_Comm_C >= coutCommInt1) && (coutCommInt2 == 0 || cr.Mt_Comm_C <= coutCommInt2) select cr.Id;
方案二:用PredicateBuilder构建动态条件(适合真·动态场景)
如果你的条件是动态生成的(比如根据用户选择拼接不同条件),可以用LinqKit库的PredicateBuilder来组合表达式:
- 先通过NuGet安装
LinqKit包 - 编写代码:
using LinqKit; // 初始化基础条件 var predicate = PredicateBuilder.New<Staxe>(cr => cr.Date_Comm >= dateTime1 && cr.Date_Comm <= dateTime2); // 追加你的两个条件 predicate = predicate.And(cr => (coutCommInt1 == 0 || cr.Mt_Comm_C >= coutCommInt1)); predicate = predicate.And(cr => (coutCommInt2 == 0 || cr.Mt_Comm_C <= coutCommInt2)); // 执行查询时需要调用AsExpandable()解析表达式 var OnePoste = bd.Staxe.AsExpandable().Where(predicate).Select(cr => cr.Id);
内容的提问来源于stack exchange,提问作者Aymane Tahri
相关产品推荐
相关产品推荐

