我正在尝试创建一个自定义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 => 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>)'需要一个'ParallelQuery >>类型的接收器'
我不太确定如何在这个实例中使用并行查询,或者是否有其他解决方案 . 有任何想法吗?
1 回答
您必须在where子句中构建
Contains
调用作为表达式的一部分在这种情况下,List比Array更好,因为list有
Contains
函数,而Array只有扩展名