如果另一个不存在,Linq将从表中返回不同的值

时间:2016-08-23 11:14:55

标签: c# .net linq linq-to-sql

我正在尝试从Centers.CenterCode中不存在Staging.CenterCode的Staging返回所有不同的行。

目前,Stagings有大约850个不同的CenterCodes和Center是空的,所以我应该得到所有不同的行,但是计数不同:)

有什么想法吗?

 var query =
                (from s in db.Stagings
                 join t in db.Centers on s.CenterCode equals t.CenterCode into tj
                 from t in tj.DefaultIfEmpty() 
                 where s.CenterCode != t.CenterCode
                 select s.CenterCode).Distinct();

            var c = query.Count();

我只需要来自分段的唯一列,所以不确定我是否真的需要与上面的连接,因为我从未使用从中心返回的数据 - 但我已经尝试了两者并获得相同的0值计数。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我不会使用连接,但使用包含。

var centerCodesQuery = db.Centers.CenterCode
    .Select(x => x.CenterCode);
var query = db.Staging
    .Where(x => !centerCodesQuery.Contains(x.CenterCode))
    .Select(x => x.CenterCode)
    .Distinct();
var c = query.Count();

答案 1 :(得分:0)

join是内部联接。因此,如果1表中的所有行都与指定标识符上的其他表匹配,那么它将返回0.在您的表中,您尝试将具有850个不同行的表与空表联接。这将返回0。

如果您实际上只想返回1个表格中不在另一个表格中的那些行,则可以使用Except

var query = (from s in db.Stagings
             select s.CenterCode)
             .Except(from t in db.Centers 
                     select t.CenterCode);

var c = query.Count();

答案 2 :(得分:0)

您似乎正在尝试通过antijoin实施left outer join,这是可能的方法之一,但为了使其有效,您需要更改

where s.CenterCode != t.CenterCode

where t == null