如何使用LINQ to DataSet过滤集合

时间:2012-02-10 20:13:30

标签: c# linq dataset linq-to-dataset

我正在使用包含两个表的DataSet,我试图通过LINQ获取数据。

我正在努力弄清楚如何返回符合条件的记录的语法。

示例:

以下是两个表格:

FooBar Items

FooBar Data

此查询加入两个表(项目Z将被过滤掉)

private void ParseFooBar()
{
 ....
 var fooBars = from item in fooBarItems 
      join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"]
      where (new[] {"A","B","C"}).Contains(item["id"])
      select new
      {
      id = item["id"],
      description = item["description"],
      wat = data["wat"],
      foo = data["foo"]                 
      };
}

这是从上述查询派生的集合。

FooBar Items joined with FooBar Data

问题:如何仅返回Foo项目?

注意Foo项在第一行/记录中如何具有非空值,而Bar项在第一行/记录中没有非空值。使用所有Foo项在foo列中至少有一个非null并且bar项永远不会在foo列中具有非null值这一事实,如何更新上述查询以便查询仅返回Foo项?同样,如何更新查询以便它只返回Bar项?

2 个答案:

答案 0 :(得分:1)

我不完全清楚成为Foo和Bar的标准是什么,但这里有一些想法:

var foos1 = fooBars.Where(fb => fb.wat != "bar");
var foos2 = fooBars.Where(fb => fb.wat == "foo" || fb.wat == null);
var foos3 = fooBars.Where(fb => fb.wat == "foo" || fb.foo != null);
var bars = fooBars.Where(fb => fb.wat == "bar" || fb.foo != null);

答案 1 :(得分:1)

这取决于您希望过滤不需要的nulls的位置。如果在加入级别,您可以稍微改变您的查询:

from item in fooBarItems 
join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"]
where (new[] {"A","B","C"}).Contains(item["id"]) && data["foo"] != null
select new
{
   id = item["id"],
   description = item["description"],
   wat = data["wat"],
   foo = data["foo"]                 
};

这将只返回两个元素:

  • A, I am a Foo, null, 10834
  • B, I am a Foo, null, 08385383

要获取剩余的(包括foo null但它们属于Foo且具有非空条目的那些),请使用{{1}的组合主查询后的{}和.GroupBy

.Where

这将选择整个组,但只选择那些至少一个fooBars .GroupBy(f => f.id) .Where(g => g.Any(f => f.foo != null)) .SelectMany(g => g); // just to make it nice list-like looking 且具有非空值的组(这将是最终集合中的所有条目,除了那些{{1 }})。