簡體   English   中英

Linq表達式,用於實體子項的條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM