具有数据库列名到实际列值的字符串参数

时间:2017-12-08 12:46:43

标签: c# linq lambda asp.net-core

我有一个方法,它发送一个具有数据库列名称的字符串参数(paramType)。我想在Select语句中获取列的值。

我需要用该列的值替换paramType。

var details = DetailsRepository
                        .Find(application => application.Created > compareDate)
                        .Select(m => new {m.ApplicationId, paramType })
                        .Distinct();

我只需要用列的名称替换paramType是Select。假设我有paramtype ="地址",我希望第二个元素是m.Address。

1 个答案:

答案 0 :(得分:0)

如果paramType的值是成员名称,那么为此,您必须在运行时构建表达式树。这是可能的,但是很麻烦,除非你要选择的所有列总是属于同一类型。由于你想要选择,这是进一步复杂 lambda中的元组。坦率地说,在这种情况下动态编写SQL会更容易......

编辑:你可以尝试这个,这表明了这里需要的邪恶数量:

static Expression<Func<Application, T>> BuildTupleSelector<T>(
    string paramType, Func<T> usedForGenericTypeInference)
{
    var m = Expression.Parameter(typeof(Application), "m");
    var body = Expression.New(typeof(T).GetConstructors().Single(),
        new Expression[] {
            Expression.PropertyOrField(m, nameof(Application.ApplicationId)),
            Expression.PropertyOrField(m, paramType)
        },
        new MemberInfo[]
        {
            typeof(T).GetProperty("ApplicationId").GetGetMethod(),
            typeof(T).GetProperty("Value").GetGetMethod()
        });
    return Expression.Lambda<Func<Application, T>>(body, m);
}

用法:

var details = DetailsRepository
   .Find(application => application.Created > compareDate)
   .Select(BuildTupleSelector(paramType,
       () => new { ApplicationId = 123, Value = "abc" }))
   .Distinct();

现在应该是匿名类型,其中包含int ApplicationIdstring Value