5

私は他のいくつかの投稿が同様の質問をしているのを見ましたが、率直に言って私は混乱しています。EntityFarmeworkとLinqで次のSQLステートメントを実行しようとしていますが、「NOTIN」と「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

だから私は以下のようにwhere句のいくつかを持っていますが、 and句joinを行うことはできません。NOT INUNION

from t in LmsTeams
join g in Games on t.GameId equals g.Id
  where t.GameId == 1 && t.Active == true
  select t
4

4 に答える 4

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

データコンテキストがないため、テストしていませんが、そのように行う必要があると思います。

アップデート

私はあなたが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
于 2013-03-27T10:59:56.140 に答える
1

別の解決策は、左外部結合を使用して、結合された列がnullであるレコードを保持することです。

以下に例を示します。

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});
于 2014-03-04T18:46:01.560 に答える
0

問題を簡単に解決するために、以下のようにクエリを記述して分割することができます。

また、私の投稿を確認してください:SQL to LINQ(ケース7-INおよびNOT IN句を使用してデータをフィルタリングする)

//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とnotinのグラフィカル表現-linqクエリ

ここに画像の説明を入力してください


sqlからlinqへの変換には、次を使用できます:Linqer ここに画像の説明を入力してください

于 2013-03-27T11:01:39.603 に答える
0
var homeIds = LmsEventMatch.Where(em => em.Eventid == 1)
                           .Select(em => em.TeamHomeId);
var awayIds = LmsEventMatch.Where(em => em.Eventid == 1)
                           .Select(em => em.TeamAwayId);
var allIds = homeIds.Union(awayIds);

var query = LmsTeams.Where( 
                t => !allIds.Contains( t.Id ) && t.Active == 1 && t.GameId == 1);
于 2013-03-27T11:05:47.897 に答える