繁体   English   中英

怎么办我组成动态 lambda 表达式的一部分,其中包含 C# 中的操作

[英]How to do I compose a part of dynamic lambda expression which contains operations inside it in C#

所以我有一个场景,我需要达到以下最终 lambda 表达式:

v => Convert.ToInt32(v.COLUMN_NAME.Substring(start_index, length)) < Convert.ToInt32(v.ANOTHER_COLUMN_NAME.Substring(start_index, length))

v 也是动态的(通过获取其参数从另一个 lambda 接收),COLUMN_NAME 和 ANOTHER_COLUMN 名称都是动态的(从单独的 DB 中检索)和 Substring,< 运算符也从 DB 中检索。 start_index 是一个计算值,其中 start_index = v.COLUMN_NAME.Length() 如何创建这个表达式,其子表达式基本上也是动态的。

对于非复杂表达式(即我可以将 COLUMN_NAME 和 VALUE 进行比较,因为 VALUE 直接作为数据库条目提供给我,这是我使用的代码:

ParameterExpression p = primaryQuery.Parameters[0]


var pr = Expression.PropertyOrField(p, filter.COLUMN_NAME);
var val = Expression.Constant(filter.COLUMN_VALUE);
MethodInfo method = typeof(string).GetMethod("Equals", new[] { typeof(string) });
// this scenario is particular for operator fetched from filter table = Equals
containsMethodExp = Expression.Call(val, method, pr);
Expression.Lambda<Func<TABLE_TO_BE_QUERIED, bool>>(containsMethodExp, p);

我已经被困在这里很长时间了,有什么见解吗?

我会使用 LINQKit 提出更有用的解决方案:

public static class MyDbFunctions
{
    [Expandable(nameof(LessThanImpl))]
    public static bool LessThan(string str1, string str2, int start_index, int lenght)
    {
        return Convert.ToInt32(str1.Substring(start_index, length)) < Convert.ToInt32(str2.Substring(start_index, length));
    }

    private static Expression<Func<string, string, int, int, bool>> LessThanImpl()
    {
        return (str1, str2, start_index, lenght) =>
            Convert.ToInt32(str1.Substring(start_index, length)) < Convert.ToInt32(str2.Substring(start_index, length))
    }
}

而且用法很简单:

query = query
    .AsExpandable()
    .Where(v => MyDbFunctions.LessThan(v.COLUMN_NAME, v.ANOTHER_COLUMN_NAME, start_index, length));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM