实体框架 - Linq NOT IN查询

gis*_*per 5 .net linq entity-framework

我已经看到其他几个帖子提出类似问题,但坦率地说我很困惑.我正在尝试在EntityFarmework和Linq中执行以下sql语句,但是无法使'NOT IN'和'UNION'正常工作

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
Run Code Online (Sandbox Code Playgroud)

所以我已经得到了join如下所示的where子句但不能执行NOT IN和UNION子句.

from t in LmsTeams
join g in Games on t.GameId equals g.Id
  where t.GameId == 1 && t.Active == true
  select t
Run Code Online (Sandbox Code Playgroud)

Mar*_*zek 3

那个怎么样:

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
Run Code Online (Sandbox Code Playgroud)

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

更新

我认为你可以避免Union这里:

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
Run Code Online (Sandbox Code Playgroud)