2017-01-06 48 views
0

我想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 

變換這樣的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

+0

你的SQL沒有'qb.Fabricator_id不是NULL',但是你的Linq有'qb.Fabricator_id.HasValue'。此外,爲什麼你不只是通過'qb.Name'和'qb.ContactEmail'進行分組而不是進行兩個子查詢,或者只是使用'Distinct'而不是分組? – juharr

+0

IS NOT NULL不會影響任何。我通過2個整數進行分組,獲得ID,然後子查詢只是爲了獲得關於這些ID的更多信息。 – 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

在原始查詢中用'let uf = uniqueFabricators.Key'代替'uniqueFabricators'中的uf就足夠了。 –

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;