[英]Linq expression for where condition on entity child
你好,
我如何通过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"));
但不适用于儿童的情况:
_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.
正确的方法是什么?
先感谢您。
据我了解,您有一个类型为Expression<Func<TEntity, TProperty>>
的字段_property
(在这种情况下,实际上是Expression<Func<TEntity, string>>
),该e => e.Name
已使用lambda表达式(例如e => e.Name
)进行了初始化。 , 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
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.