Linq lambda内的反射属性(动态属性)

时间:2018-02-11 11:46:28

标签: c# .net linq expression-trees

如何将x.Demographic.AgeRange替换为任何其他字段? 例如

var field_to_check  = "Country";
x.Demographic.ReflectedProperty(field_to_check)=="USA"



var field_to_check  = "AgeRnage";
x.Demographic.ReflectedProperty(field_to_check)=="20-30"

我尝试了一个被反射的财产。但是不能成功。

  Favourability = db.Questions
                    .OrderByDescending(x => x.Responces.Count(y => y.Responseval == Constants.options.Agree || y.Responseval == Constants.options.Tend_to_Agree))
                    .Select(z => new
                    {

                        z.QuestionTitle,
                        Count = z.Responces.Where(x =>
                                x.Demographic.AgeRange == repval &&
                                (x.Responseval == Constants.options.Agree || x.Responseval == Constants.options.Tend_to_Agree)
                        )
                        .Count()
                    })
                    .Select(z => new
                    {
                        z.QuestionTitle,
                        z.Count,
                        Perc = ((z.Count / totresponcecount) * 100)
                    }
                    )
                    .ToList();

这样我只能编写一个linq语句作为动态过滤而不是所有必需属性的switch语句。

1 个答案:

答案 0 :(得分:0)

您可以从多个不同的表达式构建表达式树。使用LinqKit,然后写:

Expression<Func<Demography, string>> fieldSpec = d => d.AgeRange;

然后在你的经历中:

var exp =  db.Questions.AsExpadable() ... fieldSpec.Expand(x.Demographic) == repval ...

现在您需要做的就是动态构建fieldSpec,这对您来说是一个练习:)