Я пытаюсь преобразовать такой SQL-запросLINQ - группа по вопросам
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
в 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 целым числам, чтобы получить идентификаторы, подзапросы - это просто, чтобы получить больше информации об этих идентификаторах. – Eugen
, но они вам не нужны. Вместо этого вы могли бы присоединиться к таблице «CustomerBase». Также вы говорите, что результаты выполнения запроса различны или просто что сгенерированный SQL отличается? Если это результаты, то как они отличаются друг от друга. – juharr