【问题标题】:Select Columns runtime in LINQ LIST<>在 LINQ LIST<> 中选择列运行时
【发布时间】:2012-03-30 00:10:36
【问题描述】:

我有List&lt;Employee&gt; listEmployees

我想选择一些在编译时未知的动态列,例如:

 var result = from l listEmployees
              select "" 

我试过listEmployees.select("Name");

但它会抛出一个错误:

'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)' 无法从用法中推断出来。尝试明确指定类型参数。

如何仅选择在运行时确定的列?

【问题讨论】:

  • @SLaks 出于性能考虑,如果我只需要表中 300 列中的几列,那么只选择我需要的列不是更好吗?还是说选择整行并使用所需的列仍然足够好(性能方面)?
  • @Sнаđошƒаӽ:您应该在编译时指定所需的列。如果您在编译时不知道它们,那么您可能不应该使用 LINQ。

标签: c# linq


【解决方案1】:

您正在寻找Dynamic LINQ

【讨论】:

  • 我试过了..但还是不行..我在 LIST 中有数据源所以它不工作
  • @ghanshyam.mirani:致电.AsQueryable()
  • 嗨.. 试过 listEmployees.AsQueryable().Select("Name");还是不行
  • 有没有办法在本地实现,我的意思是不使用任何第三方库?
  • @Sнаđошƒаӽ:您可以使用反射构建表达式树。
【解决方案2】:

您可以使用动态 linq,它是一个开源项目,我用于真正的动态 linq 查询:

Article on Scott's Blog

希望对您有所帮助。

【讨论】:

  • 当我们有 LIST 时该怎么做,因为 Employee 是类而不是 databaseTable 上下文
  • @ghanshyam.mirani 抱歉,我不明白你的问题,DynamicLinq 不仅适用于数据表,它还适用于 POCO。
【解决方案3】:

这是一种非常有效的方法

var result = from l in listEmployees
             select l.GetType().GetProperty(propertyName).GetValue(l, null);

propertyName 是您在运行时传递的任何字符串。

当然,您可能希望将 select 之后的位提取为方法并添加一些检查。

【讨论】:

  • 他在编译时不知道他想要包含什么。
猜你喜欢
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2021-12-11
相关资源
最近更新 更多