gpt4 book ai didi

c# - Linq-EF 中的自定义扩展方法等同于 SQL "IN"子句

转载 作者:太空宇宙 更新时间:2023-11-03 15:00:34 25 4
gpt4 key购买 nike

我正在尝试创建一个自定义的 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[]' does not contain a definition for 'Contains' and the best extension method overload 'ParallelEnumerable.Contains>>(ParallelQuery>>, Expression>)' requires a receiver of type 'ParallelQuery>>'

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

最佳答案

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

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只有extension

关于c# - Linq-EF 中的自定义扩展方法等同于 SQL "IN"子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46406433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com