【问题标题】:Custom Extension Method in Linq-EF Equivalent to SQL "IN" ClauseLinq-EF 中的自定义扩展方法等效于 SQL“IN”子句
【发布时间】:2017-09-25 22:01:58
【问题描述】:

我正在尝试创建一个自定义 Linq to Entities 扩展方法,该方法采用逗号分隔的字符串,将其转换为数组,然后使用 IEnumerable<string>.Contains 生成等效的 SQL IN 子句。

当您始终知道要应用此过滤器的表/实体及其列/属性时,这很容易。挑战在于我希望能够在任何实体或属性上使用此扩展方法。

这是我已经走了多远:

public static IQueryable<TSource> CustomInClause<TSource>(this IQueryable<TSource> myQuery, Expression<Func<TSource, string>> colExpression, string filterCriteria)
{
    string[] myArray = filterCriteria.Split(",", StringSplitOptions.RemoveEmptyEntries);

    //Various other operations here..............

    if (myArray.Length > 0)
    {
        myQuery = myQuery.Where(b => myArray.Contains(colExpression));
    }

    return myQuery;
}

如您所见,我正在尝试使用 colExpression 作为动态表达式,它相当于 x =&gt; x.SomeColumn 其中 SomeColumn 可以是任何字符串/varchar 列。

然后我会像这样实现这个扩展:

var q = context.SomeTable.CustomInClause(f => f.SomeColumn, someString);

var q2 = context.OtherTable.CustomInCluse(f => f.OtherColumn, otherString);

现在我收到此错误:

'string[]' 不包含 'Contains' 的定义和最好的 扩展方法重载 'ParallelEnumerable.Contains>>(ParallelQuery>>, Expression>)' 需要一个类型的接收器 '并行查询>>'

我不太确定在这种情况下如何使用并行查询,或者是否有其他解决方案。有什么想法吗?

【问题讨论】:

    标签: c# sql-server string entity-framework linq


    【解决方案1】:

    您必须在 where 子句中构建 Contains 调用作为表达式的一部分

    var myArray = filterCriteria.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                   .ToList();   
    var containsExp = Expression.Call(Expression.Constant(myArray), 
                                        "Contains", null, colExpression.Body);
    
    if (myArray.Count > 0)
    {
        myQuery = myQuery.Where(Expression.Lambda<Func<TSource, bool>>
                                            (containsExp, colExpression.Parameters));
    }
    
    return myQuery;
    

    在这种情况下List优于Array,因为list有Contains函数,而Array只有扩展

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多