0

我有一个 linq 查询,我需要能够从数据表中选择可变数量的字段。我确实知道所有可以包含的字段,但只有两个肯定会在数据表中。我还将知道数据表中包含哪些字段(它会根据用户的选择而有所不同)。现在我设置了这样的东西:

var query = from item in dt.AsEnumerable()
            group item by item.Field<string>("ID") into g
            select new
            {
                ID = g.Key, //required
                Status = g.Min(i => dostuff(i,"Status")), //not required
                Disc = g.Min(i => dostuff(i,"Disc")), //not required
                Loc = String.Join<string>(",", from i in g select i.Field<string>("Loc")) //required
            };

dostuff(DataRow i,string field)
{
    try
    {
        return i.Field<string>(field);  
    }
    catch
    {
        return null;
    }
}

所以 dostuff 基本上只是检查数据集中是否存在该字段,然后我只需要在处理查询结果时忽略不存在的字段,这不会太难。但是,似乎有更好的方法可以做到这一点,但我很难通过谷歌找到任何关于使用动态选择子句的信息。

4

1 回答 1

0

你可以用动态类型来做(注意,我没有测试,所以这可能有错别字。):

var query =dt.AsEnumerable().GroupBy(item => item.Field<string>("ID"))
      .Select(g => {
         dynamic t = new System.Dynamic.ExpandoObject();

         if (g.Table.Columns.Any(c => c.ColumnName == "Status"))
          t.Status = g.Field<string>("Status");

         if (g.Table.Columns.Any(c => c.ColumnName == "Disc"))
          t.Disc = g.Field<string>("Disc");

         t.ID = g.Key;
         t.Loc = String.Join<string>(",",g.Select(i => i.Field<string>("Loc"))); 
         return t;
      }    
于 2013-07-30T16:24:22.420 回答