2016-12-20 3 views
2

私はEntity Framework 6とASPNet Core 1.1を使用しています。LINQジョインでの条件の追加方法

私はメーカーのリストとそれに付随する資産の数を取得しようとしています。

Assets.ManufacturerID -> Manufacturers.ManufacturerID 

次のクエリはうまく動作し、私が望む結果がほとんど得られます。

var result = (from m in _context.Manufacturers 
       join a in _context.Assets       
       on m.ManufacturerID.ToString() equals a.ManufacturerID             
       into joined 
       where m.status == 0 
       select new AssetsDB.ViewModels.ManufacturerIndexViewModel() 
       { 
        ManufacturerID = m.ManufacturerID, 
        Description = m.Description, 
        Count = joined.Count() 
       }); 

ただし、追加のwhereステートメントを導入して、アセットの状態をフィルタリングしたいだけです。

私は声明で&に参加した後、次の使用しようとしましたが、それは仕事と「」現在のコンテキスト内に存在しないと言っておく

where a.state == 0 
where m.status == 0 && a.state == 0 

はあなたが私にどのようにアドバイスを与えてもらえていません私はそれを達成することができますか?前

答えて

4

フィルターAssetsコレクションがjoinを適用します。

var result = ( from m in _context.Manufacturers 
       join a in _context.Assets.Where(a=>a.state==0) //Add this      
       on m.ManufacturerID equals a.ManufacturerID into joined 
       where m.status == 0 
       select new AssetsDB.ViewModels.ManufacturerIndexViewModel() 
       { 
        ManufacturerID = m.ManufacturerID, 
        Description = m.Description, 
        Count = joined.Count() 
       }); 

事はあなたが結果のセレクターは、最初のコレクションのすべての要素にではなく、二番目の要素にアクセスすることがgroup joinを行っているあります個別に言い換えると、第1のコレクションの各エンティティについて、第2のコレクションの相関エンティティはjoinedコレクションにグループ化され、結果セレクタでアクセスできます。ここで

2

はラムダの方法は、

var result = _context.Manufacturers 
    .Where(m => m.status == 0) 
    .Join(_context.Assets.Where(a => a.state == 0), 
     a => a.ManufacturerID, 
     m => m.ManufacturerID.ToString(), 
     (a,m) => new AssetsDB.ViewModels.ManufacturerIndexViewModel 
       { 
         ManufacturerID = m.ManufacturerID, 
         Description = m.Description, 
         Count = m.Count() 
       } 
    ) 
    .ToList(); 
です
関連する問題