我正在使用包含两个表的DataSet
,我试图通过LINQ获取数据。
我正在努力弄清楚如何返回符合条件的记录的语法。
示例:
以下是两个表格:
此查询加入两个表(项目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"]
};
}
这是从上述查询派生的集合。
问题:如何仅返回Foo项目?
注意Foo项在第一行/记录中如何具有非空值,而Bar项在第一行/记录中没有非空值。使用所有Foo项在foo列中至少有一个非null并且bar项永远不会在foo列中具有非null值这一事实,如何更新上述查询以便查询仅返回Foo项?同样,如何更新查询以便它只返回Bar项?
答案 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 }})。