2

以下に示すように、複数のテーブルで結合を使用するときに最初のレコードを取得するための最良の方法に関するアドバイスを探しています。

私は3つのテーブルを持っています:

  • リード<-これは結果で一意である必要があります
  • LeadAddresses(結合テーブル)
  • 住所

通常、私は次のように参加します。

from t2
    in db.Leads
    .Where(o => t1.LeadId == o.Lead_ID)
from t4
    in db.LeadAddresses
    .Where(o => t2.Lead_ID == o.Lead_ID)
    .DefaultIfEmpty()
from t5
    in db.Addresses
    .Where(o => t4.Address_ID == o.Address_ID)
    .DefaultIfEmpty()

(これが悪い習慣である場合は、私に知らせてください;)

各リードレコードのAddressesテーブル(たとえば、最大IDを持つテーブル)からプロパティを取得し、モデルにプロジェクトを作成しようとしています。

select new LeadGridModel
        {
            ...
        });

例:

Lead Company | City    | ZIP
==============================
Company 1    | Boston  | 00000
Company 2    | Houston | 00001
4

1 に答える 1

3
from l in db.Leads
from a in l.LeadAddresses.Select(la => la.Address).OrderByDescending(a => a.ID).Take(1).DefaultIfEmpty()
select new { l, a }

これはトリッキーに見えるかもしれませんが、部分的に理解しています。

  1. OrderByDescendingと組み合わせて使用​​するとTake(1)、最大IDのアドレスを取得します
  2. DefaultIfEmptyを使用して、左結合を作成します。

SQL Serverの制限により、このパターンはループ結合を強制することに注意してください。小さな結果セットの場合、これは通常問題ではありません。

于 2012-05-31T16:51:56.777 に答える