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

C# 动态LINQ查询,根据变量选择最大列名,c#,sql,linq,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>(

为什么下面的代码不能产生预期的结果

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();
        }
公共字符串LinqTest()
{
//为了清晰起见,这里进行了硬编码
//真正的代码将命中数据库
var jsonString=“DrugClass”;
列表药物列表=新列表()
{
新药(),
新药(),
新药(),
新药()
};
var query=(来自药物列表中的d)
选择d.GetType().GetProperty(jsonString)).Max();
返回query.ToString();
}

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

如果你从这段代码中去掉
.Max()
,你会看到它返回一个
IEnumerable
。。。不是你想要的

var query = (from d in drugList
             select d.GetType().GetProperty(jsonString)).Max();
你就快到了。。。获得
PropertyInfo
类后,可以使用其
GetValue
方法从该类的实际实例中获取该属性的值

在下面的代码中,我将获取属性的代码(
let property=…
语句)与获取被评估的特定
druges
类的值(最后一行)的代码分开。这应该对你有用(在LINQPad为我工作)


注意:如果您使用的是.NET 4.5或更高版本,您可以从
GetValue
中删除
null
,只需执行
property.GetValue(d)
。。。在早期版本的.NET中,它是必需的,因为没有重载只会占用
属性信息

如果从这段代码中去掉
.Max()
,您将看到它返回一个
IEnumerable
。。。不是你想要的

var query = (from d in drugList
             select d.GetType().GetProperty(jsonString)).Max();
你就快到了。。。获得
PropertyInfo
类后,可以使用其
GetValue
方法从该类的实际实例中获取该属性的值

在下面的代码中,我将获取属性的代码(
let property=…
语句)与获取被评估的特定
druges
类的值(最后一行)的代码分开。这应该对你有用(在LINQPad为我工作)


注意:如果您使用的是.NET 4.5或更高版本,您可以从
GetValue
中删除
null
,只需执行
property.GetValue(d)
。。。在早期版本的.NET中,它是必需的,因为没有重载只会占用
属性信息

如果从这段代码中去掉
.Max()
,您将看到它返回一个
IEnumerable
。。。不是你想要的

var query = (from d in drugList
             select d.GetType().GetProperty(jsonString)).Max();
你就快到了。。。获得
PropertyInfo
类后,可以使用其
GetValue
方法从该类的实际实例中获取该属性的值

在下面的代码中,我将获取属性的代码(
let property=…
语句)与获取被评估的特定
druges
类的值(最后一行)的代码分开。这应该对你有用(在LINQPad为我工作)


注意:如果您使用的是.NET 4.5或更高版本,您可以从
GetValue
中删除
null
,只需执行
property.GetValue(d)
。。。在早期版本的.NET中,它是必需的,因为没有重载只会占用
属性信息

如果从这段代码中去掉
.Max()
,您将看到它返回一个
IEnumerable
。。。不是你想要的

var query = (from d in drugList
             select d.GetType().GetProperty(jsonString)).Max();
你就快到了。。。获得
PropertyInfo
类后,可以使用其
GetValue
方法从该类的实际实例中获取该属性的值

在下面的代码中,我将获取属性的代码(
let property=…
语句)与获取被评估的特定
druges
类的值(最后一行)的代码分开。这应该对你有用(在LINQPad为我工作)

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

d。GetType().GetProperty()
不会返回您认为是的内容。它返回一个对象,该对象描述与类型相关的属性,而不是特定实例,这正是您想要的

拥有该描述对象后,需要做的是使用该方法对特定实例上的属性求值

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

你会更接近你要找的东西

d.GetType().GetProperty()
没有返回您认为是的内容。它返回一个对象,该对象描述与类型相关的属性,而不是特定实例,这正是您想要的

拥有该描述对象后,需要做的是使用该方法对特定实例上的属性求值

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

你会更接近你要找的东西

d.GetType().GetProperty()
没有返回您认为是的内容。它返回一个对象,该对象描述与类型相关的属性,而不是特定实例,这正是您想要的

你需要做什么