2017-01-06 2 views
0

私はこれまでのところ、私はSQL 1と非常に似ています、このようなクエリ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 
      }; 

を持って、LINQに、このようなSQLクエリ

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 

を変換しようとしていますしかし、結果は完全に異なっています。

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'を持っている必要はありません。なぜ2つのサブクエリを実行するのではなく、 'qb.Name'と' qb.ContactEmail'でグループ化しなかったのですか、あるいはグループ化する代わりに 'Distinct'を使うだけでしたか? – juharr

+0

IS NOT NULLは何とか影響しません。私はIDを取得するために2つの整数でグループ化しています。サブクエリはこれらの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

元のクエリで 'uf in uniqueFabricators'を' let uf = uniqueFabricators.Key'に置き換えるだけで十分でしょう。 –

0

それはされなかった元のSQL要求で、JOINを使用する必要はありませんを使用する必要もないだろう。

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;