2016-03-24 19 views
2

2つのテーブルがあります。表1には領域のリストが、表2にはサンプルのリストが、各サンプル行には外部キーとしてArea_IDが含まれています。LINQ 2つのテーブルを結合し、テーブルAに対応するテーブルBの最新レコードを選択するクエリ

最新の対応するサンプルステータスのみを使用して、エリアテーブル内のすべてのレコードを取得する必要があります。私はこのクエリを持っていますが、それだけでサンプルテーブルから最新のサンプルで1つのエリアを返します。

var result = (
    from a in db.area 
    join c in db.sample 
    on a.location_id equals c.location_id 

    select new 
    { 
     name = a.location_name, 
     status = c.sample_status, 
     date = c.sample_date 
    }).OrderByDescending(c => c.date).FirstOrDefault(); 
+0

:あなたはAreaSample間の一対多の関係をしていると仮定すると。 –

答えて

2

ソリューションは、あなたの第二DbSetをフィルタリングすることができます

var result = from a in db.area 
       join c in db.sample.Where(s=>s.location_id==a.location_id).OrderByDescending(c => c.sample_date).Take(1) 
       on a.location_id equals c.location_id 
       select new 
        { 
         name = a.location_name, 
         status = c.sample_status, 
         date = c.sample_date 
        }; 

別の解決策を適用することができgroup join

var result = from a in db.area 
       join c in db.sample 
       on a.location_id equals c.location_id into samples 
       let sample=samples.OrderByDescending(c => c.sample_date).FirstOrDefault() 
       select new 
        { 
          name = a.location_name, 
          status = sample.sample_status, 
          date = sample.sample_date 
        }; 

ナビゲーションプロパティを使用するとさらに簡単になります。あなたは、コレクションが空の場合にのみ使用可能な最初のコレクションから1またはnullを選択FirstOrDefault()を持っているためだ

var result =from a in db.area 
      let sample= a.Samples.OrderByDescending(c => c.sample_date).FirstOrDefault() 
      select new 
        { 
          name = a.location_name, 
          status = sample.sample_status, 
          date = sample.sample_date 
        }; 
+0

グループ結合ソリューションは完璧に機能しました!では、aとcを新しいグループのサンプルに結合し、FirstOrDefaultを使用して日付ごとにサンプルのグループをフィルタリングしていますか?すばらしいです! – emerfan

+1

) – octavioccl

+0

グループ結合について言えば、表示する関連するサンプルがないエリアのケースも処理する必要があります。表示するすべてのエリアが必要です(「エリアテーブル内のすべてのレコードを検索する必要があります。 ")、これを行う1つの方法は、ステータスフィールドと日付フィールドを次のように変更することです。 status = sample.sample_status == null? "NA":sample.sample_status、 date = "" + sample.sample_date これは私が私の場合に使用したものです。 – NicolasW