2

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

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

例子:

下面是两张表:

FooBar 项目

FooBar 数据

此查询连接两个表(项目 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 项与 FooBar 数据连接

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

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

4

2 回答 2

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);
于 2012-02-10T20:17:14.370 回答
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 的那些),请在主查询之后使用.GroupByand的组合:.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

这将选择整个组,但只选择至少有一个foo非空值的组(这将是最终集合中的所有条目,除了带有 的条目id = C)。

于 2012-02-10T20:36:38.997 回答