gpt4 book ai didi

c# - 实体子项上 where 条件的 Linq 表达式

转载 作者:太空狗 更新时间:2023-10-30 01:31:28 25 4
gpt4 key购买 nike

你好,

如何通过 linq 表达式构建以下语句以便将其转换为 sql?

builder.Where(e => e.SomeChild.Name.ToLower() == "something");

builder 是一个 DbContext。当我直接调用它时,它被正确解释为这样

select ... from someTable 
inner join childTable on ...
where LOWER(childTable.Name) = @someParam

所以我以这种方式构建 where 条件:

private readonly Expression<Func<TEntity, TProperty>> _property;

private Expression<Func<TEntity, bool>> insensitiveEqualityPredicate(string formula)
{
var parameter = Expression.Parameter(typeof(TEntity));
var property = (PropertyInfo)((MemberExpression)_property.Body).Member;
var propertyParameter = Expression.Parameter(property.DeclaringType);
var lowerExpression = Expression.Call(
Expression.Invoke(_property, propertyParameter),
typeof(string).GetMethods().Where(m => m.Name == "ToLower" && m.GetParameters().ToList().Count == 0).FirstOrDefault()
);
return Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
lowerExpression,
Expression.Constant(formula.ToLower(), typeof(string))
),
parameter
);
}

它就像魅力一样:

_property = e => e.Name;
...
builder.Where(insensitiveEqualityPredicate("whatever"));

但不适用于 child 条件:

_property = e => e.SomeChild.Name;
...
builder.Where(insensitiveEqualityPredicate("whatever"));

因为:

The LINQ expression 'Param_0.Name.Equal("whatever")' could not be translated and will be evaluated locally.

什么是正确的做法?

提前谢谢你。

最佳答案

据我了解,您有一个字段 _property类型 Expression<Func<TEntity, TProperty>> (在这种特殊情况下,它实际上是 Expression<Func<TEntity, string>> ),它是用类似 e => e.Name 的 lambda 表达式初始化的, e => e.SomeChild.Name等等

为了构建所需的谓词,您可以重用 _property表达式参数并使用 Body 属性作为新表达式的基础:

private readonly Expression<Func<TEntity, TProperty>> _property;

private Expression<Func<TEntity, bool>> insensitiveEqualityPredicate(string formula)
{
return Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
Expression.Call(_property.Body, "ToLower", Type.EmptyTypes),
Expression.Constant(formula.ToLower(), typeof(string))
),
_property.Parameters
);
}

关于c# - 实体子项上 where 条件的 Linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41086891/

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