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

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

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


我只需要将paramType替换为Select列的名称。假设我有paramtype =“ Address”,我希望第二个元素是m.Address。

最佳答案

如果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的匿名类型。

关于c# - 具有数据库列名的字符串参数到实际列值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47714732/

10-09 00:05