select qb.Fabricator_id, cj.Client_id,
(select Name from CustomerBase where Id = qb.Fabricator_id),
(select ContactEmail from CustomerBase where Id = qb.Fabricator_id)
from ClientJob cj, Quote q, QuoteBid qb
where cj.Client_id in (39343, 39157)
and q.ClientJob_id = cj.Id
and qb.Quote_id = q.Id
group by qb.Fabricator_id, cj.Client_id
order by cj.Client_id, qb.Fabricator_id
變換這樣的SQL查詢到LINQ,到目前爲止,我有這樣的查詢
var customerId = new[] {39343, 39157};
var query = from cj in _dataContext.ClientJob join q in _dataContext.Quote on cj.Id equals q.ClientJob_id
join qb in _dataContext.QuoteBid on q.Id equals qb.Quote_id
where customerId.Contains(cj.Client_id.Value)
&& qb.Fabricator_id.HasValue
group new { CustomerId = cj.Client_id, FabricatorId = qb.Fabricator_id } by new { qb.Fabricator_id, cj.Client_id} into uniqueFabricators
from uf in uniqueFabricators
orderby uf.CustomerId, uf.FabricatorId
select new
{
uf.CustomerId,
uf.FabricatorId,
FabricatorName = _dataContext.CustomerBase.Single(_ => _.Id == uf.FabricatorId).Name,
FabricatorEmail = _dataContext.CustomerBase.Single(_ => _.Id == uf.FabricatorId).ContactEmail
};
看起來頗爲相似,SQL一組但是,結果完全不同。
如果我在LINQPad中執行它,結果SQL查詢看起來有點類似,但不完全。
-- Region Parameters
DECLARE @p0 Int = 39343
DECLARE @p1 Int = 39157
-- EndRegion
SELECT [t4].[Client_id] AS [CustomerId], [t6].[Fabricator_id] AS [FabricatorId], (
SELECT [t7].[Name]
FROM [CustomerBase] AS [t7]
WHERE ([t7].[Id]) = [t6].[Fabricator_id]
) AS [FabricatorName], (
SELECT [t8].[ContactEmail]
FROM [CustomerBase] AS [t8]
WHERE ([t8].[Id]) = [t6].[Fabricator_id]
) AS [FabricatorEmail]
FROM (
SELECT [t2].[Fabricator_id], [t0].[Client_id]
FROM [ClientJob] AS [t0]
INNER JOIN [Quote] AS [t1] ON ([t0].[Id]) = [t1].[ClientJob_id]
INNER JOIN [QuoteBid] AS [t2] ON ([t1].[Id]) = [t2].[Quote_id]
WHERE (([t0].[Client_id]) IN (@p0, @p1)) AND ([t2].[Fabricator_id] IS NOT NULL)
GROUP BY [t2].[Fabricator_id], [t0].[Client_id]
) AS [t3]
CROSS JOIN ([ClientJob] AS [t4]
INNER JOIN [Quote] AS [t5] ON ([t4].[Id]) = [t5].[ClientJob_id]
INNER JOIN [QuoteBid] AS [t6] ON ([t5].[Id]) = [t6].[Quote_id])
WHERE ((([t3].[Fabricator_id] IS NULL) AND ([t6].[Fabricator_id] IS NULL)) OR (([t3].[Fabricator_id] IS NOT NULL) AND ([t6].[Fabricator_id] IS NOT NULL) AND ((([t3].[Fabricator_id] IS NULL) AND ([t6].[Fabricator_id] IS NULL)) OR (([t3].[Fabricator_id] IS NOT NULL) AND ([t6].[Fabricator_id] IS NOT NULL) AND ([t3].[Fabricator_id] = [t6].[Fabricator_id]))))) AND ((([t3].[Client_id] IS NULL) AND ([t4].[Client_id] IS NULL)) OR (([t3].[Client_id] IS NOT NULL) AND ([t4].[Client_id] IS NOT NULL) AND ((([t3].[Client_id] IS NULL) AND ([t4].[Client_id] IS NULL)) OR (([t3].[Client_id] IS NOT NULL) AND ([t4].[Client_id] IS NOT NULL) AND ([t3].[Client_id] = [t4].[Client_id]))))) AND (([t4].[Client_id]) IN (@p0, @p1)) AND ([t6].[Fabricator_id] IS NOT NULL)
ORDER BY [t4].[Client_id], [t6].[Fabricator_id]
我的LINQ查詢出了什麼問題,看不到問題。
THX
你的SQL沒有'qb.Fabricator_id不是NULL',但是你的Linq有'qb.Fabricator_id.HasValue'。此外,爲什麼你不只是通過'qb.Name'和'qb.ContactEmail'進行分組而不是進行兩個子查詢,或者只是使用'Distinct'而不是分組? – juharr
IS NOT NULL不會影響任何。我通過2個整數進行分組,獲得ID,然後子查詢只是爲了獲得關於這些ID的更多信息。 – Eugen
但你不需要它們。您可以加入到「CustomerBase」表中。你是否也在說運行查詢的結果是不同的,或者只是生成的SQL不同?如果是結果,那麼它們究竟有什麼不同。 – juharr