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