【问题标题】:Dynamic Expression from query, Expression call来自查询的动态表达式,表达式调用
【发布时间】:2016-04-04 10:36:10
【问题描述】:

嘿,在我的代码中,我有一个构建“where 表达式”的方法。它看起来像这样:

private static Expression<Func<T, bool>> BuildWhereExpression<T>(Context context, string memberName, string memberValue)
{
    memberValue = memberValue.Trim().RemoveDiacritics().ToLower();

    var param = Expression.Parameter(typeof(T), "x");

    var propsNames = memberName.Split('.');
    Expression propExpression = param;
    foreach (var propName in propsNames)
    {
        propExpression = Expression.Property(propExpression, propName);
    }

    var methodToLower = typeof(string).GetMethods().First(x => x.Name == "ToLower" && x.GetParameters().Length == 0);
    var toLowerCall = Expression.Call(propExpression, methodToLower);

    var methodDiacritics = typeof(context).GetMethod("GetStringWithoutDiacritics");
    var funcCall = Expression.Call(Expression.Constant(context), methodDiacritics, toLowerCall);

    var methodContains = typeof(string).GetMethods().First(x => x.Name == "Contains" && x.GetParameters().Length == 1);
    var containsCall = Expression.Call(funcCall, methodContains, Expression.Constant(memberValue));

    var lambda = Expression.Lambda<Func<T, bool>>(containsCall, param);

    return lambda;
}

其中“GetStringWithouDiacritics”是我数据库中的一个标量函数(代码优先)。当与 'Where' 一起使用时,这会产生以下结果:

WHERE ([dbo].[GetStringWithoutDiacritics](LOWER([Extent2].[Col1])) LIKE N'%blabla%')

这没关系,但因为我在性能很糟糕的情况下使用标量函数。我想做的是在函数'inline'中编写sql代码。它应该产生类似:

WHERE CONVERT(VARCHAR(MAX),REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(Col1) COLLATE Latin1_General_BIN, N'ș','s') COLLATE Latin1_General_BIN, N'ț','t') COLLATE Latin1_General_BIN, N'î', 'i') COLLATE Latin1_General_BIN, N'ă', 'a') COLLATE Latin1_General_BIN, N'â', 'a'))
                                     LIKE '%parite%'

我的问题是如何修改构建 where 表达式的方法。我知道这是动态表达,但我不知道如何.. , 用我的实际列替换 'Col1' 等。

【问题讨论】:

  • 您不需要.._AI 排序规则吗?你不能在数据库中设置它吗?

标签: c# entity-framework linq-to-sql lambda expression-trees


【解决方案1】:

你用的是什么数据库?在 MSSQL 中,您可以以可以内联的方式定义函数。我会先这样探索。

如果这对您不起作用,那么这里有一个link 来回答如何很好地组合表达式树。在这种情况下,您可以删除标量函数,并完全在 C# 中定义您的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多