如何将SQL Where规则用于Linq过滤数据,System.Linq.Dynamic.Core不生效如何解决
基于SQL规则过滤Linq查询的可行方案
问题原因
你当前代码无法生效的核心原因有两个:
- 类型不匹配:
promotion_type_code是int类型,你写的规则promotion_type_code = '33'将数值用单引号包裹识别为字符串,Dynamic LINQ严格校验类型,无法完成匹配 - 需确保已正确引入依赖:要先安装
System.Linq.Dynamic.Core的NuGet包,且代码顶部引用using System.Linq.Dynamic.Core;命名空间
修正后的实现方案
方案1:使用System.Linq.Dynamic.Core(推荐)
修正规则的类型写法后即可正常运行,示例代码如下:
using System.Linq.Dynamic.Core; // 必须引入该命名空间 class Program { static void Main(string[] args) { PromotionVm lObjPromVm = new PromotionVm(); for (int i = 1; i <= 5; i++) { PromotionList lObjPromList = new PromotionList(); lObjPromList.active_indicator = 1; lObjPromList.principle_code = "a" + i; lObjPromList.promotion_code = "b" + i; lObjPromList.promotion_plan_number = 20 + i; lObjPromList.promotion_type_code = 30 + i; lObjPromList.start_date = DateTime.Now.AddDays(i); lObjPromVm.promotion_list.Add(lObjPromList); } // 单条件规则:int类型不要加单引号 var sqlRule = "promotion_type_code == 33"; // Dynamic LINQ用==做相等判断,也支持= var result = lObjPromVm.promotion_list.Where(sqlRule).ToList(); // 此时result会正确返回promotion_type_code=33的那条数据 // 多条件规则写法示例,兼容复杂逻辑 var complexRule = "promotion_type_code > 32 AND promotion_plan_number IN (23,24,25) AND (active_indicator == 1 OR start_date > @0)"; var complexResult = lObjPromVm.promotion_list.Where(complexRule, DateTime.Now.AddDays(3)).ToList(); } } // 其余类定义保持不变即可
语法适配注意事项
- 数值、布尔类型不需要加单引号,字符串类型需要加单引号
- 支持
IN、AND、OR、括号分组等SQL常用语法,相等判断可以用=也可以用== - 动态参数可以用
@0、@1占位符传入,避免字符串拼接的语法问题
方案2:转DataTable用原生SQL语法过滤
如果需要完全兼容原生SQL的Where规则,可以先把集合转成DataTable,再用Select方法过滤:
// 先把List转DataTable,可自己实现扩展方法或者用第三方工具类完成转换 var dataTable = lObjPromVm.promotion_list.ToDataTable(); // 直接用原生SQL规则过滤,完全支持你原来的SQL写法 var rows = dataTable.Select("promotion_type_code = '33'"); // 再把DataRow转回PromotionList对象即可
内容的提问来源于stack exchange,提问作者Dilip
相关产品推荐
相关产品推荐

