C# 使用NaturalComparer作为字符串的动态LINQ Where子句

C# 使用NaturalComparer作为字符串的动态LINQ Where子句,c#,sql,linq,entity-framework,C#,Sql,Linq,Entity Framework,我问了一个问题,现在我有了一个更复杂的版本 该查询假设一个简单的查询,如ProductCode>'U5',并在Where子句中使用自然比较程序: var comparer = new NaturalComparer(); Table1.AsEnumerable().Where(t=> comparer.Compare(t.ProductString, "U5") >= 0); 下面的代码是一个简单的已知示例,但实际上过滤器是嵌套的,具有和/或操作数的组合,在运行时

我问了一个问题,现在我有了一个更复杂的版本

该查询假设一个简单的查询,如ProductCode>'U5',并在Where子句中使用自然比较程序:

    var comparer = new NaturalComparer();
Table1.AsEnumerable().Where(t=> 
    comparer.Compare(t.ProductString, "U5") >= 0);
下面的代码是一个简单的已知示例,但实际上过滤器是嵌套的,具有和/或操作数的组合,在运行时之前是未知的。我希望以字符串形式传递到动态LINQ查询中:数据位于使用LINQ to实体的SQL Server db上

例如:

    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);
var queryString=“((ProductCode>'U5'或类似'%k'的标记字符串)和日期或者PriorityString动态Linq只是一个简单的邪恶,应该避免


这里您真正想要使用的是Joe Albahari的,让您动态地构建where子句(与Dynamic linq一样),但通过使用常规LINQ的类型安全属性。

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

嗨,James,我想传入字符串的原因是我正在使用Dev Express FilterControl()。此控件将where子句作为字符串提供给我。这正是我所担心的。为了它的价值,我对您的前一个问题给出了一个答案(在接受另一个答案后),该答案实际上提供了一个更通用的解决方案,而无需求助于动态LINQ,也无需将整个表拉入EF进行查询: