2010-06-25 68 views
1

我有SQL 2008服務器與表員工,電話和電子郵件,其中員工與電話和電子郵件(所以員工可以有很多電話號碼和電子郵件)一對多關係。LINQ到SQL - 生成錯誤的SQL?

現在我想查詢員工的所有電話和電子郵件:

var query = (from e in db.Employee 
      select new EmployeeDTO 
      { 
       Id = e.Id, 
       Name = e.Name, 
       Phones = e.Phones, 
       Emails = e.Emails 
      }).ToList(); 

但LINQ轉換它非常難看SQL,這讓左與電話表連接,但隨後查詢像單獨的查詢每個員工的電子郵件:

SELECT [t0].[EmployeeID], [t0].[Name], [t1].[Phone] (
    SELECT COUNT(*) 
    FROM [dbo].[Phone] AS [t2] 
    WHERE [t2].[EmployeeID] = [t0].[EmployeeID] 
    ) AS [value] 
FROM [dbo].[Employee] AS [t0] 
LEFT OUTER JOIN [dbo].[Phone] AS [t1] ON [t1].[EmployeeID] = [t0].[EmployeeID] 
ORDER BY [t0].[EmployeeID], [t1].[PhoneID] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926 

SELECT [t0].[EmailID], [t0].[Email] 
FROM [dbo].[Email] AS [t0] 
WHERE [t0].[EmployeeID] = @x1 
-- @x1: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [1ed2e9a0-ca4b-4912-8f8e-000ed8d0b2af] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926 

SELECT [t0].[EmailID], [t0].[Email] 
FROM [dbo].[Email] AS [t0] 
WHERE [t0].[EmployeeID]= @x1 
-- @x1: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [2203192b-05ef-4b59-b4b4-0010e26a8119] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926

我需要的是簡單的SQL:

SELECT [t0].[EmployeeID], [t0].[Name], [t1].[Phone], [t2].[Email] 
FROM [dbo].[Employee] AS [t0] 
LEFT OUTER JOIN [dbo].[Phone] AS [t1] ON [t1].[EmployeeID] = [t0].[EmployeeID] 
LEFT OUTER JOIN [dbo].[Email] AS [t2] ON [t2].[EmployeeID] = [t0].[EmployeeID]

哪有I W儀式這樣的linq查詢沒有分組的結果? 我知道如何進行多次左連接,但後來我需要按照EmployeeID對結果進行分組。

回答

0

你試過這樣做嗎?

var query = (from e in db.Employee 
    join p in db.Phones on e.EmployeeID equals p.EmployeeID into tmpPhones 
    from phones in tmpPhones.DefaultIfEmpty() 
    join m in db.Emails on e.EmployeeID equals m.EmployeeID into tmpEmails 
    from emails in tmpEmails.DefaultIfEmpty() 

      select new EmployeeDTO 
      { 
       Id = e.Id, 
       Name = e.Name, 
       Phones = phones, 
       Emails = emails 
      }).ToList(); 

你需要的是LoadWith與多個1合作,許多關係,但不工作 -

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/a68744f6-e1f3-4d28-82eb-87b8187ec0a8/

鐵圈跳應該努力 -

var query = (from e in db.Employee 
     join p in db.Phones on e.EmployeeID equals p.EmployeeID into tmpPhones 
     from phones in tmpPhones.DefaultIfEmpty() 
     join m in db.Emails on e.EmployeeID equals m.EmployeeID into tmpEmails 
     from emails in tmpEmails.DefaultIfEmpty() 
     group e by e into eGrp 

       select new EmployeeDTO 
       { 
        Id = eGrp.Key.Id, 
        Name = eGrp.Key.Name, 
        Phones = eGrp.Select(x => x.Phones), 
        Emails = eGrp.Select(x => x.Emails) 
       }).ToList(); 
+0

是,我已經試過了,這是迄今爲止最好的解決方案,但是在這裏我需要通過EmployeeId對結果進行分組以獲得與衆不同的員工,因爲此查詢不返回不同的記錄! 如果您有1名員工,有2部電話和2封電子郵件,您會在結果中獲得4條記錄,並需要對其進行分組。 如果您只查詢手機,Linq會自動爲您分組,然後您將獲得2名手機的1名員工。 但謝謝你的回覆。 – jojojohn 2010-06-30 17:04:22