我需要一个有效的LINQ查询(如果可能的话,在方法语法中)从集合A中获取没有相应密钥的所有项目 在第二个集合B(1到n)中,或者如果B中存在元素,则只接受那些具有MyValue null的元素。简而言之:返回A中不存在的所有A元素,或者它们是否存在于B中,其中至少有一行具有MyValue = null。
table A
{
int MyKey (primary_key);
}
table B
{
int MyKey (foreign_key to A.MyKey);
string MyValue;
}
我正在尝试使用Except(),但这只适用于两个集合属于同一类型的情况。 我正在尝试GroupJoin(),但是在加入后我没有找到如何删除重复项的方法。
a.GroupJoin(
b.Where(item => item.Value = null),
el => el.MyKey,
el2 => el2.MyKey,
(el3, el4) => el3);
有了这个,我会过滤出B中的项目,这些项目在再次加入之后因为它们不再存在而被删除。
在纯sql中,很容易实现:
select * from A a left join B b on a.MyKey = b.MyKey where MyValue is null;
答案 0 :(得分:2)
嗯,它在LINQ语法中更漂亮:
var result = (
from a in aCollection
join b in bCollection on a.Key equals b.AKey into bSubCollection
where !bSubCollection.Any(x => x.Value != null)
select a
);
但是这里也是方法语法:
var result = aCollection
.GroupJoin(bCollection, a => a.Key, b => b.AKey, (a, bSub) => new { a, bSub })
.Where(c => !c.bSub.Any(x => x.Value != null))
.Select(c => c.a);
基本上,您是使用a
和b
的集合加入匿名类型的组,然后只过滤c
(a
的集合已经不同)是否有b
个非空Value
。
答案 1 :(得分:0)
您需要翻译方法语法,但您编写的左外连接的查询语法应如下:
var query = from itemA in a
join itemB in b on
itemA.MyKey equals itemB.MyKey into joinTable
from itemB in joinTable.DefaultIfEmpty()
where (itemB == null) || (itemB.MyValue == null)
select itemA;
您需要对结果应用不同的内容。 您可以看到以下帖子: Distinct by property of class by linq
或在MoreLinq
中使用DistinctBy