C# 如何使用LINQ对数据集进行筛选

C# 如何使用LINQ对数据集进行筛选,c#,linq,dataset,linq-to-dataset,C#,Linq,Dataset,Linq To Dataset,我正在使用一个数据集,它包含两个表,我正试图通过LINQ从中获取数据 我正在努力弄清楚如何返回满足条件的记录的语法 例如: 这是两张表: 此查询将两个表联接起来(Z项将被过滤掉) 这是从上述查询派生的集合。 问题:如何仅返回Foo项目? 请注意,Foo项在其第一行/记录中具有非null值,而Bar项在第一行/记录中不具有非null值。使用所有Foo项在Foo列中至少有一个非null值,而Bar项在Foo列中永远不会有非null值这一事实,我如何更新上述查询以使查询仅返回Foo项?同样,如何

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

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

例如:

这是两张表:

此查询将两个表联接起来(Z项将被过滤掉)

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

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


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

我并不完全清楚什么是成为一个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);

这取决于要从何处过滤不需要的
空值。如果处于连接级别,您可以稍微更改查询:

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,我是一个Foo,空,10834
  • B,我是一个Foo,空,08385383
要获取剩余的值(包括
foo
null
但属于具有非null条目的foo的值),请在主查询后使用
.GroupBy
的组合。其中

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
的条目)的组。

我喜欢你的想法和附加的lambda-看起来它会起作用,但它不会。更新后的查询结果返回的集合与原始集合相同。奇怪。@Jed:哦,打错了。应该是
f.foo!=null,而不是“
。现在修好了。
fooBars
    .GroupBy(f => f.id)
    .Where(g => g.Any(f => f.foo != null))
    .SelectMany(g => g); // just to make it nice list-like looking