【问题标题】:Linq Loop Through Columns in Row C# [duplicate]Linq循环遍历行C#中的列[重复]
【发布时间】:2014-06-04 13:11:05
【问题描述】:

如何在 Linq to SQL 中循环遍历列名

var foo = (from f in db.bar select f).ToList()

我想要做的是遍历每个列名,即

    foreach bar d in foo
{
    foreach column in d
      {<do something>}
}

这可能吗?

【问题讨论】:

标签: c# linq foreach


【解决方案1】:

这是一个将 LINQ-to-sql 查询作为可枚举的字典返回的方法:

IEnumerable<IDictionary<string, object>> GetValues<T>(DataContext context,
                                                         IQueryable<T> query)
    where T : class
{
    var propertyInfos = typeof(T).GetProperties().ToDictionary (pi => pi.Name);
    foreach(var entity in context.GetTable<T>())
    {
        yield return (context.Mapping.GetTable(typeof(T)).RowType.DataMembers
           .Where(dm => !dm.IsAssociation).Select (dm => dm.Name)
        .Select(name => new { name, 
                              value = propertyInfos[name].GetValue(entity, null)
                            })
        .ToDictionary (x => x.name, y => y.value));
    }
}

您从字典中获取列名和值:

var foo = (from f in db.bar select f);
foreach(var dictionary in GetValues(db, foo))
{
    // do something with dictionary keys and/or values
}

【讨论】:

    【解决方案2】:

    如果您没有使用其他字段扩展您的映射模型,或者不介意对它们进行迭代,您可以使用:

    var fields = typeof(Product).GetFields();
    foreach(var item in db.Products)  
    {  
        foreach(var f in fields)  
        {  
            Console.WriteLine(f.Name + ": " + f.GetValue(item));
        }  
     } 
    

    【讨论】:

      【解决方案3】:

      这是我认为您想要的示例,如果这还不足以让您入门,请更详细地说明您需要什么。

      var myTable = new DataTable();
      myTable.Columns.Add("Column One");
      myTable.Columns.Add("Column Two");
      
      var newRow = myTable.NewRow();
      newRow[0] = 11111;
      newRow[1] = 22222;
      myTable.Rows.Add(newRow);
      
      var newRow2 = myTable.NewRow();
      newRow2 [0] = 33333;
      newRow2 [1] = 44444;
      myTable.Rows.Add(newRow2);
      
      
      foreach (var row in myTable.AsEnumerable())
      {
          foreach (DataColumn column in myTable.Columns)
          {
              Console.WriteLine("Column {0}, Row {1}, Value {2}", column.ColumnName, myTable.Rows.IndexOf(row), row[column]);
          }
      }
      

      【讨论】:

      • 我认为这里的问题是我没有使用数据表,而是使用 linq to sql 类
      • @JStellato - 模拟一些东西供我使用,我会给你写一些代码,但我不使用 L2S,因为它很慢,所以我没有任何准备测试的东西和。就像我说的,写一个快速的模型,我会让它工作:)
      • @Vijay 如果您根本不熟悉问题所基于的工具/范式,那么您为什么要首先回答它?
      • @Servy - 最初的问题没有解释什么是什么,因此我们问了前几个问题。我在他们回复之前写了这篇文章,因为我猜测他们的意思。我提议编写代码是因为没有其他人回答,如果他们需要我愿意的帮助,这对 OP 来说是一个不错的提议。
      • 问题本身,没有被编辑,说它是一个 LINQ to SQL 问题,代码显然是 LINQ to SQl 代码而不是DataTable。不需要对这一点进行澄清。
      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2019-08-07
      • 2019-06-15
      相关资源
      最近更新 更多