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

时间:2014-09-12 06:54:50

标签: c# sql linq entity-framework

我在Use a NaturalSortComparer in a LINQ Where Clause问了一个问题,现在我有一个更复杂的版本。

该查询假设了一个简单的查询,如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处理字符串字段,以及正常处理的任何其他字段类型?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

动态Linq只是简单的邪恶,应该避免。

你真正想要使用的是Joe Albahari的Predicate Builder,它允许你动态构建一个where子句(与Dynamic linq一样),但是使用常规LINQ的类型安全属性。