0

この SQL を LINQ2SQL クエリにフォーマットする必要があります。2 番目の結合に問題があります (左)。ネストされたクエリを使用したくないので、動作する SQL を書きました。前もって感謝します。

select * from 
Accounts a 
inner join
Addresses ea on a.GUID = ea.UID 
left join 
Addresses ea2 on a.GUID = ea2.GUID and AddressTypeID = 2    
where 
ba.AccountID = 100 and
ea.AddressTypeID = 1

私のlinq2SQLコードは次のとおりです。

var data =
                from account in dc.Accounts                    
                join primaryAddress in dc.Addresses on account.GUID equals
                    primaryAddress.GUID
                join secondaryAddress in dc.Addresses on account.GUID equals
                    secondaryAddress.GUID
                    into leftSecondaryAddress
                from secondaryAddress in
                    leftSecondaryAddress.Where(
                        x =>
                        x.AddressTypeID == 2).DefaultIfEmpty()                    
                where
                    brokerAccount.AccountID == 100 &&
                    primaryAddress.AddressTypeID == 1

何を変更すればよいですか?

4

2 に答える 2

0

SQL から (結合を使用して) 開始する場合、多くの場合、linq 結合も使用するのが自然に思えます。しかし、多くの場合、ナビゲーション プロパティを使用する方がはるかに簡単で短時間です。残念ながら、クラス モデルが表示されていないため、どのナビゲーション プロパティが存在するかを推測する必要があります。しかし、それは次のようなものかもしれません:

var data = 
   from account in dc.Accounts
   where account.AccountID == 100 // where does brokerAccount come from??
   select new {
                Account = account,
                PrimaryAddress =  account.Addresses
                                  .FirstOrDefault(a => a.AddressTypeID == 1),
                SecondaryAddress = account.Addresses
                                  .FirstOrDefault(a => a.AddressTypeID == 2)
              };

クエリよりもそれほど短くは見えませんが、それはクエリに . が含まれていないためselectです。そこで、ナビゲーション プロパティを使用できることを願っています。データを取得する方法ではなく、必要データに集中するのに役立ちます。

于 2013-02-12T18:53:12.927 に答える
0

これに匿名型を使用して複数の列で結合すると、クエリを改善できます。

var data =
    from account in dc.Accounts                    
    join primaryAddress in dc.Addresses on account.GUID equals primaryAddress.GUID
    join secondaryAddress in dc.Addresses on new { account.GUID, AddressTypeID = 2 } equals new { secondaryAddress.GUID, secondaryAddress.AddressTypeID }
        into leftSecondaryAddress
    from secondaryAddress in leftSecondaryAddress.DefaultIfEmpty()                    
    where
        brokerAccount.AccountID == 100 &&
        primaryAddress.AddressTypeID == 1
于 2013-02-11T17:20:30.693 に答える