Linq外部加入条件

时间:2013-09-13 12:05:25

标签: c# sql database linq

我需要一个有效的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;

2 个答案:

答案 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);

基本上,您是使用ab的集合加入匿名类型的组,然后只过滤ca的集合已经不同)是否有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