Linq选择具有未知字段数的子句

时间:2013-07-30 15:25:25

标签: c# linq

我有一个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基本上只是检查数据集中是否存在该字段,然后我只需要在处理查询结果时忽略不存在的字段,这不会太困难。然而,似乎有更好的方法可以做到这一点,但我很难通过谷歌找到关于使用动态选择条款的任何内容。

1 个答案:

答案 0 :(得分:0)

你可以使用动态类型(nb,我没有测试,所以这可能有拼写错误。):

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;
      }