gpt4 book ai didi

c# - linq to Entities中where子句中的扩展方法

转载 作者:太空狗 更新时间:2023-10-29 23:16:52 25 4
gpt4 key购买 nike

在 linq to Entities 中,我们需要一种类似于“sql like”的方法。我们已经为 IQueryable 实现了我们自己的扩展方法,因为包含方法对我们不起作用,因为它不接受像 '%a%b%' 这样的模式

创建的代码是:

private const char WildcardCharacter = '%';

public static IQueryable<TSource> WhereLike<TSource>(this IQueryable<TSource> _source, Expression<Func<TSource, string>> _valueSelector, string _textSearch)
{
if (_valueSelector == null)
{
throw new ArgumentNullException("valueSelector");
}

return _source.Where(BuildLikeExpressionWithWildcards(_valueSelector, _textSearch));
}

private static Expression<Func<TSource, bool>> BuildLikeExpressionWithWildcards<TSource>(Expression<Func<TSource, string>> _valueSelector, string _textToSearch)
{
var method = GetPatIndexMethod();

var body = Expression.Call(method, Expression.Constant(WildcardCharacter + _textToSearch + WildcardCharacter), _valueSelector.Body);

var parameter = _valueSelector.Parameters.Single();
UnaryExpression expressionConvert = Expression.Convert(Expression.Constant(0), typeof(int?));
return Expression.Lambda<Func<TSource, bool>> (Expression.GreaterThan(body, expressionConvert), parameter);
}

private static MethodInfo GetPatIndexMethod()
{
var methodName = "PatIndex";

Type stringType = typeof(SqlFunctions);
return stringType.GetMethod(methodName);
}

这可以正常工作并且代码完全在 SqlServer 中执行,但现在我们将在 where 子句中使用此扩展方法:

myDBContext.MyObject.Where(o => o.Description.Like(patternToSearch) || o.Title.Like(patterToSerch));

问题在于,如果 where 子句中使用的方法与“||”等运算符一起使用,则必须返回 bool 结果,而且我不知道如何使我创建的代码返回一个 bool 值并使代码在 sqlserver 中执行。我想我必须将 BuildLinqExpression 方法返回的表达式转换为 bool,但我不知道该怎么做

总结一下!首先,是否可以在 Linq to Entities 中创建我们自己的扩展方法来执行 SqlServer 中的代码?如果这是可能的,我必须怎么做?

感谢您的帮助。

最佳答案

不,您不能训练 EF 处理您的自定义扩展方法,即使您有构建表达式的代码,可用于 EF。

或者:

  • 直接在 EF Where 表达式中使用 SqlFunctions 方法
  • 使用 ExpressionVisitor 将多个表达式组合成一个复合 (OrElse/AndAlso) 表达式(注意这不会帮助您获得代码就像你想要的那样,但它会让你使用你的两种方法并对它们执行 || - 虽然它看起来很复杂)

第一个更简单明了。

关于c# - linq to Entities中where子句中的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718361/

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