动态LINQ查询,根据变量选择最大列名称

时间:2013-11-05 21:38:03

标签: c# sql linq

为什么以下代码不会产生预期结果?

public string LinqTest()
        {
            //hardcoded here for clarity's sake
            //real code will hit a database
            var jsonString = "DrugClass";
            List<Drugs> drugList = new List<Drugs>()
            {
                new Drugs() { DrugId=1, DrugClass="HHH", DrugDosage=120, DrugName="Drug1"},
                new Drugs() { DrugId=2, DrugClass="H2H", DrugDosage=100, DrugName="Drug2"},
                new Drugs() { DrugId=3, DrugClass="HHH", DrugDosage=100, DrugName="Drug3"},
                new Drugs() { DrugId=4, DrugClass="WA2", DrugDosage=200, DrugName="Drug4"}
            };
            var query = (from d in drugList
                        select d.GetType().GetProperty(jsonString)).Max();
            return query.ToString();
        }

我希望这段代码从您上面看到的集合中选择属性DrugClass并返回“WA2”。为什么不是这种情况?

2 个答案:

答案 0 :(得分:3)

如果您从这段代码中取消.Max(),您会看到它返回IEnumerable<PropertyInfo> ...而不是您想要的。

var query = (from d in drugList
             select d.GetType().GetProperty(jsonString)).Max();

你几乎就在那里......一旦你得到PropertyInfo类,就可以使用它的GetValue方法从该类的实际实例中获取该属性的值。

在下面的代码中,我从获取特定let property = ...类的值(最后一行)的代码中分离出获取属性的代码(Drugs语句)评估。这应该适合你(在LINQPad中为我工作)。

var query = (from d in drugList
             let property = d.GetType().GetProperty(jsonString)
             select property.GetValue(d, null)).Max();

注意:如果您使用的是.NET 4.5或更高版本,则可以从null删除GetValue,然后执行property.GetValue(d) ...在早期版本的.NET中需要它因为没有超载只需要PropertyInfo

答案 1 :(得分:0)

d.GetType().GetProperty()没有回复你的想法。它返回一个PropertyInfo对象,该对象描述与Type相关的属性,而不是特定实例,这是您想要的。

拥有该描述对象后需要执行的操作是使用GetValue(Object)方法评估特定实例上的属性。

我相信,如果你将LINQ更改为(未经测试的)

var query = (from d in drugList
    select d.GetType().GetProperty(jsonString).GetValue(d).ToString()).Max();

你会更接近你正在寻找的东西。