2013-02-11 60 views
0

我需要將此SQL格式化爲LINQ2SQL查詢。我有第二次加入的問題(左)。我不想使用嵌套查詢,所以我編寫了SQL的工作。先謝謝你。將sql左連接轉換爲不帶嵌套查詢的linq2sql代碼

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 

我應該怎麼改?

+0

**將**想要更正的linq-to-sql代碼帶給**上的非嵌套查詢結果**。 – AgentFire 2013-02-11 15:30:40

+0

@AgentFire - 已更新。 – Cemsha 2013-02-11 15:41:42

回答

0

你可以提高你的查詢,如果您參加由多個列通過使用此一anonymous type

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 
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。所以我希望你可以使用導航屬性。它有助於更​​多關注什麼你想要的數據而不是如何獲得它們。