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