2017-01-18 20 views
1

サンプルサイトごとに複数のレコードを持つことができる3つの子テーブルを持つサンプルサイトテーブルがあります。左外部結合を行う必要があったので、すべてのサンプル・サイトを取得する必要がありました。たとえすべての子レコードが関連付けられていなくても(テーブルの1つが現在空です)。LINQ - 最近のレコードの複数の左外部結合のみ

SampleSiteDataViewModel viewModel = 
      (from s in db.SAMPLESITES_EVW 
      from b in db.BACTERIA_EVW.Where(b => b.FIELDSITEID == fieldSiteId).DefaultIfEmpty() 
      from c in db.CHEMISTRY_EVW.Where(c => c.FIELDSITEID == fieldSiteId).DefaultIfEmpty() 
      from m in db.MACROS_EVW.Where(m => m.FIELDSITEID == fieldSiteId).DefaultIfEmpty() 
      where s.FIELDSITEID == fieldSiteId 
      select new SampleSiteDataViewModel 
       { 
        MPN_ECOLI = b.MPN_ECOLI, 
        DO_PERCENT = c.DO_PERCENT, 
        PH = c.PH, 
        TDS = c.TDS, 
        TEMP_C = c.TEMP_C, 
        OE = m.OE, 
        DESCRIP = s.DESCRIP 
       }).FirstOrDefault(); 

しかし、私は複数のレコードが存在する場合、それは「にISNので、これは必ずしも、最も最近の細菌/化学/マクロの記録を返さないことに気づいた。私はSOに行ったいくつかの研究に基づいて、私はこれがしました1対1の関係。だから、私は .OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault().DefaultIfEmptyを交換しようとしたが、私はこのエラーを得た:

「タイプの表現 『をBACTERIA_EVW』失敗したソースタイプ 『DbSet』型推論とクエリ式に句から、その後に許可されていません。 'SelectMany'の呼び出しで

レコードが存在しない状況を考慮しながら最新のレコードだけを正しく選択するにはどうすればよいですか?私はそれを複数のlinqクエリに分割する方が簡単だと思いますが、可能であれば、単一のデータベース呼び出しでそれを実行したいと思います。

ETA - これはEntity Frameworkの "データベースからコードを最初に読み込む"モデルを使用してSQL ServerにロードされたESRIジオデータベースを使用しています。

+0

@Gert Arnold - これは実際にはESRIジオデータベースであり、モデルを「データベースからコードを最初に」追加する必要があったため、あなたの質問を理解していればプロパティ。 – Ella

+0

私はLINQ to SQLの意味について誤解されていたはずです。タグをEntity Frameworkに更新します。 – Ella

答えて

2

あなたはほとんどそこにいます。

.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault() 

交換

.DefaultIfEmpty() 

呼び出しが細かいです。しかし、結果のタイプはシーケンスから単一アイテムに変更されるため、対応するfromキーワードをletキーワードに置き換える必要があります。

関連する問題