2017-01-06 7 views
0

Ich versuche, solche eine SQL-AbfrageLINQ - Gruppe von Fragen

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 

in LINQ, so weit ich habe eine solche Abfrage

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 
      }; 

, die ganz ähnlich wie die SQL sucht man zu transformieren Die Ergebnisse sind jedoch völlig anders.

Wenn ich es in LINQPad ausführen, sieht die Ergebnis-SQL-Abfrage etwas ähnlich, aber nicht ganz.

-- 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] 

Was in meiner LINQ-Abfrage falsch ist, kann das Problem nicht sehen.

Thx

+0

Ihr SQL hat nicht 'qb.Fabricator_id IST NICHT NULL', aber Ihre Linq hat' qb.Fabricator_id.HasValue'. Warum haben Sie nicht einfach nach 'qb.Name' und' qb.ContactEmail' gruppiert, anstatt zwei Unterabfragen zu machen, oder einfach 'Distinct' statt Gruppieren? – juharr

+0

IS NOT NULL hat keine Auswirkungen. Ich gruppiere nach 2 ganzen Zahlen, um die IDs zu erhalten, die Unterabfragen dienen nur dazu, mehr Informationen über diese IDs zu bekommen. – Eugen

+0

aber Sie brauchen sie nicht. Sie könnten stattdessen der Tabelle "CustomerBase" beitreten. Sie sagen auch, dass die Ergebnisse der Abfrage anders sind, oder nur, dass das generierte SQL anders ist? Wenn es die Ergebnisse sind, wie unterscheiden sie sich dann? – juharr

Antwort

0

Die Abfrage Rechte

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 
     }; 

keine Notwendigkeit, eine andere Unterabfrage from uniqueFabricators

+1

Es wäre genug gewesen, einfach "von uf in uniqueFabricators" durch "let uf = uniqueFabricators.Key" in Ihrer ursprünglichen Abfrage zu ersetzen. –

0

Es besteht keine Notwendigkeit zu verwenden JOIN, in der ursprünglichen SQL-Anfrage zu verwenden wäre es nicht sein.

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;