首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架- Linq NOT IN查询

实体框架- Linq NOT IN查询
EN

Stack Overflow用户
提问于 2013-03-27 18:51:57
回答 4查看 7.5K关注 0票数 5

我看过其他几篇问类似问题的帖子,但坦率地说,我很困惑。我正尝试在EntityFarmework和Linq中执行以下sql语句,但无法执行'NOT IN‘和'UNION’语句

代码语言:javascript
运行
复制
SELECT LmsTeam.* FROM LmsTeam
INNER JOIN Game ON LmsTeam.GameId = Game.ID 
WHERE LmsTeam.Id NOT IN 
(SELECT TeamHomeId as TeamID FROM LmsEventMatch WHERE EventId =1
UNION
SELECT TeamAwayId as TeamID FROM LmsEventMatch WHERE EventId =1)
AND LmsTeam.GameId = 1 AND LmsTeam.Active = 1

所以我得到了下面的join和一些where子句,但不能处理NOT INUNION子句。

代码语言:javascript
运行
复制
from t in LmsTeams
join g in Games on t.GameId equals g.Id
  where t.GameId == 1 && t.Active == true
  select t
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-27 18:59:56

这个怎么样:

代码语言:javascript
运行
复制
from t in LmsTeams
join g in Games on t.GameId equals g.Id
where t.GameId == 1 && t.Active == true && !(
        (from m in LmsEventMatch where m.EventId == 1 select m.TeamHomeId).Union(
         from m in LmsEventMatch where m.EventId == 1 select m.TeamAwayId)
    ).Contains(t.Id)
select t

我没有测试它,因为没有您的数据上下文,但我认为应该这样做。

更新

我认为你可以在这里避免使用Union

代码语言:javascript
运行
复制
from t in LmsTeams
join g in Games on t.GameId equals g.Id
where t.GameId == 1 && t.Active == true && !(
        LmsEventMatch.Where(m => m.EventId == 1).SelectMany(m => new int[] { m.TeamHomeId, TeamAwayId })
    ).Contains(t.Id)
select t
票数 3
EN

Stack Overflow用户

发布于 2014-03-05 02:46:02

另一种解决方案是使用Left outer join,并保留连接列为null的记录。

下面给出一个示例:

代码语言:javascript
运行
复制
var query = db.Categories    
  .GroupJoin(db.Products,
      Category => Category.CategoryId,
      Product => Product.CategoryId,
      (x, y) => new { Category = x, Products = y })
  .SelectMany(
      xy => xy.Products.DefaultIfEmpty(),
      (x, y) => new { Category = x.Category, Product = y })
  .Where(w => w.Product.CategoryId == null)
  .Select(s => new { Category = s.Category});
票数 1
EN

Stack Overflow用户

发布于 2013-03-27 19:01:40

你可以像下面这样写和划分你的查询,这样可以很容易地解决你的问题。

另请查看我的帖子:SQL to LINQ ( Case 7 - Filter data by using IN and NOT IN clause)

代码语言:javascript
运行
复制
//first do the union of two
var query = ((from d in  LmsEventMatch 
             where d.EventId == 1
              select d.TeamHomeId).
        Union(from e in  LmsEventMatch 
                       where e.EventId == 1
                          select e.TeamAwayId));

//than perform !contains operation for no in
var records =( from t in LmsTeams
join g in Games on t.GameId equals g.Id
  where t.GameId == 1 && t.Active == true && !query.Contains(t.Id)
  select t).ToList();

in和not in - linq查询的图形表示

对于从sql到linq的转换,可以使用:Linqer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15657086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档