2017-01-06 3 views
0

Я пытаюсь преобразовать такой 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

+0

Ваш SQL не имеет 'qb.Fabricator_id НЕ NULL', но ваш Linq имеет' qb.Fabricator_id.HasValue'. Также почему вы просто не группировали «qb.Name» и «qb.ContactEmail» вместо двух подзапросов или просто использовали «Distinct» вместо группировки? – juharr

+0

IS NOT NULL никак не влияет. Я группируюсь по 2 целым числам, чтобы получить идентификаторы, подзапросы - это просто, чтобы получить больше информации об этих идентификаторах. – Eugen

+0

, но они вам не нужны. Вместо этого вы могли бы присоединиться к таблице «CustomerBase». Также вы говорите, что результаты выполнения запроса различны или просто что сгенерированный SQL отличается? Если это результаты, то как они отличаются друг от друга. – juharr

ответ

0

Запрос прав не будет

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 { cj.Client_id, qb.Fabricator_id } by new { qb.Fabricator_id, cj.Client_id } into uniqueFabricators 
    orderby uniqueFabricators.Key.Client_id, uniqueFabricators.Key.Fabricator_id 
     select new 
     { 
      uniqueFabricators.Key.Client_id, 
      uniqueFabricators.Key.Fabricator_id, 
      FabricatorName = _dataContext.CustomerBase.Single(_ => _.Id == uniqueFabricators.Key.Fabricator_id).Name, 
      FabricatorEmail = _dataContext.CustomerBase.Single(_ => _.Id == uniqueFabricators.Key.Fabricator_id).ContactEmail 
     }; 

нет необходимости использовать другой подзапрос from uniqueFabricators

+1

Было бы достаточно просто заменить 'from uf in uniqueFabricators'' let uf = uniqueFabricators.Key' в вашем исходном запросе. –

0

Там нет необходимости использовать JOIN, в первоначальном запросе SQL не было быть.

var customerId = new[] {39343, 39157}; 

var query = from subquery in 
      (
       from qb in _dataContext.QuoteBid 
       from cj in _dataContext.ClientJob 
       from q in _dataContext.Quote 
       where customerId.Contains(cj.Client_id) && 
        q.ClientJob_id = cj.Id && 
        qb.Quote_id = q.Id 
       select new 
       { 
        Fabricator_id = qb.Fabricator_id, 
        Client_id = cj.Client_id, 
        Name = CustomerBase.Name, 
        ContactEmail = CustomerBase.ContactEmail 
       } 
      ) 
      group subquery by Fabricator_id into group1 
      group group1 by Client_id into group2 
      orderby group2.Client_id, group2.Fabricator_id 
      select group2; 
Смежные вопросы