使用NaturalComparer将动态LINQ Where子句作为字符串

本文关键字:子句 字符串 Where LINQ NaturalComparer 动态 使用 | 更新日期: 2023-09-27 18:21:45

我在LINQ Where子句中使用NaturalSortComparer时问了一个问题,现在我有了一个更复杂的版本。

该查询假设了一个简单的查询,如ProductCode>'U5',并在Where子句中使用NaturalComparer:

    var comparer = new NaturalComparer();
Table1.AsEnumerable().Where(t=> 
    comparer.Compare(t.ProductString, "U5") >= 0);

下面的代码是一个简单的已知示例,但实际上过滤器是嵌套的,具有and/OR操作数的组合,在运行时之前是未知的。我想以字符串的形式传递到动态LINQ查询中:数据在SQL Server数据库中使用LINQ to Entities。

示例:

    var queryString= "((ProductCode > 'U5' Or TagString LIKE '%k') and Date < Now) 
Or (MessageString = 'text' And Date < yesterday) OR SomeOtherString = '100' 
or PriorityString <= '100X' or SomeInt =15";
    // Call the constructor with the specified query and the ObjectContext.
    ObjectQuery<Product> productQuery =
        new ObjectQuery<Product>(queryString, context);

如何使用NaturalComparer处理字符串字段,以及任何其他要正常处理的字段类型?

使用NaturalComparer将动态LINQ Where子句作为字符串

您将能够将自定义字符串比较函数转换为SQL。如果你尝试的话,EF只会在运行时崩溃。表达式还与这些自定义字符串比较交织在一起,这将阻止您对数据库执行所有这些操作,只对已筛选的结果执行字符串比较。这意味着,您唯一真正的选择是拉下整个数据集,在内存中完成整个操作。

动态Linq只是一种邪恶,应该避免。

你真正想在这里使用的是Joe Albahari的谓词生成器,它让你可以动态地构建where子句(就像动态linq一样),但要使用常规linq的类型安全属性。