【问题标题】:Loop Through LINQ Query Columns (Not rows)循环遍历 LINQ 查询列(不是行)
【发布时间】:2011-12-16 12:52:05
【问题描述】:

是否可以循环 LINQ 查询的结果,如果可以,如何循环?

类似这样的:

var results= from a in dt.AsEnumerable()
                    where a.Field<int>("id") == i 
                    select new 
                    {
                       id= a.Field<int>("id"),
                       a= a.Field<double>("a"),
                       b = a.Field<double>("b")
                    };

IEnumerable<string> colNames = results.First().GetType().GetProperties()
                                                        .Select(p => p.Name);

string[] columns = colNames.ToArray();

int i = 0;
foreach (var row in results)
{
    for (int i = 0; i < columns.Count(); i++)
    {
        string foobar = (string)row[columns[i]];
        i++;
    }
}

基本上,我想复制以下功能:

DataRow dr = new DataRow();
string foobar = dr[columns[i];

提前谢谢大家。

【问题讨论】:

标签: c# linq


【解决方案1】:

如果您可以选择更改原始 LINQ 语句以生成允许您执行所需操作的数据结构,我肯定会建议这样做。

如果没有,您需要使用反射通过名称查找匿名类型的属性,然后通过反射获取这些属性的值:

    PropertyInfo[] columns = results.First().GetType().GetProperties();
    ...
            string foobar = columns[i].GetValue(row, null);

【讨论】:

  • 我还没有真正的选项。但是,我使用了一些反射来获取属性,我现在不知道如何处理它们!
【解决方案2】:
Action<string> processColumName = (cname) => 
                           { 
                              // do anything you want with a column name
                              string foo = (string) Row[cname]; 
                           };

results.First()
        .GetType()
        .GetProperties()
        .Select(p => p.Name)
        .ToList().ForEach(processColumName);

【讨论】:

    【解决方案3】:

    嗯,我的回答实际上是基于别人的回答(我将在下面留下一个链接)略有变化:stovroz

    代码如下:

    foreach(var item in db.Products) {
       System.Reflection.PropertyInfo[] fields = Product.GetType().GetProperties(); 
       foreach(var f in fields) {
          Console.WriteLine(f.Name + ": " + f.GetValue(item));
       }  
    } 
    

    实际上,我一直在寻找这样的解决方案来实现动态 LINQ 的使用,而这个人拯救了我的一天。非常感谢他!

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多