【问题标题】:Linq return distinct values from table if not exist in another如果另一个表中不存在,Linq 从表中返回不同的值
【发布时间】:2016-08-23 11:14:54
【问题描述】:

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

目前 Stagings 有大约 850 个不同的 CenterCodes 并且 Centers 是空的,所以我应该得到所有不同的行,但是 count 不一样 :)

有什么想法吗?

 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();

我只需要 staging 中的唯一列,因此不确定我是否真的需要加入上述内容,因为我从未使用过从 Centers 返回的数据 - 但是我已经尝试了两者并获得了相同的 0 计数值。

有什么想法吗?

【问题讨论】:

  • 任何答案对你有帮助?

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


【解决方案1】:

我不会使用连接,而是使用包含。

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();

【讨论】:

    【解决方案2】:

    join 是一个内连接。因此,如果 1 个表中的任何行都与指定标识符上的另一个表不匹配,那么它将返回 0。在您的表中,您试图将 1 个表与 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();
    

    【讨论】:

      【解决方案3】:

      看起来您正在尝试通过left outer join 实现antijoin,这是可能的方法之一,但为了使其工作,您需要进行更改

      where s.CenterCode != t.CenterCode
      

      where t == null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-18
        • 2022-01-23
        • 2018-04-10
        • 2014-01-31
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多