【问题标题】:Remove records from 1 query based on same values found in another query根据在另一个查询中找到的相同值从 1 个查询中删除记录
【发布时间】:2012-11-12 21:51:42
【问题描述】:

所以我有 2 个IQueryable<Array> 查询,它们具有通用字符串类型;我想使用第二个查询来删除第一个使用公共类型的所有记录,只留下第一个查询的结果未找到的记录。不太清楚该怎么做。

【问题讨论】:

  • 向我们展示您的代码?您尝试过的方法无效?
  • 我只是不知道该怎么做:IQueryable a = db.ListA.Where(x => x.Active); IQueryable b = db.ListB.Where(x => x.HadReview); a = a.Concat(x => x.LogginID == b.Any.LogginID);

标签: c# linq


【解决方案1】:

最容易理解的方法是使用Where()过滤掉ListA中的项目:

IQueryable<LISTA> as = db.ListA.Where(x => x.Active);
IQueryable<LISTB> bs = db.ListB.Where(x => x.HadReview);
as = as.Where(a => bs.Any(b => a.LogginID == b.LogginID) == false);

一种可能更有效的方法是使用Group Join

var as = from a in db.ListA.Where(x => x.Active)
         join b in db.ListB.Where(x => x.HadReview) 
             on a.LogginID equals b.LogginID into bs
         where bs.Any() == false
         select a;

编辑:如果您有两个不同的 DataContexts,以上将不起作用。这可能:

IQueryable<LISTA> as = db1.ListA.Where(x => x.Active);
IQueryable<LISTB> bs = db2.ListB.Where(x => x.HadReview);
as = as.Where(a => bs.Select(b => b.LogginID).Contains(a.LogginID) == false);

另见:Linq to SQL - How to inner join tables from different Data Context?

【讨论】:

  • 很好的解决方案,谢谢,但是我还有一个问题。每个查询都在不同的数据上下文中。你能帮我用什么方法让它工作吗?
  • 为了解决我上面的问题,我做了以下操作,无法使用 Any() 方法,因为它导致了另一个问题。 var as = prdb.LISTA.Where(x => x.Active).Select(x => x.StaffUsername).ToArray(); var bs = syndb.LISTB.Where(x => x.ActiveFlag); bs = bs.Where(x => !r.Contains(x.Community.NetworkLogin));此解决方案修复了“不同的数据上下文”问题以及 .Any() 的问题,我随后将其更改为 .Contains()。
  • @JeffreyJ:可能有一种方法可以在不将任何内容存储在本地内存中的情况下执行查询。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2022-01-20
相关资源
最近更新 更多