私はこれまでのところ、私は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を
あなたのSQLは 'qb.Fabricator_idがNULL'ではありませんが、あなたのLINQのは' qb.Fabricator_id.HasValue'を持っている必要はありません。なぜ2つのサブクエリを実行するのではなく、 'qb.Name'と' qb.ContactEmail'でグループ化しなかったのですか、あるいはグループ化する代わりに 'Distinct'を使うだけでしたか? – juharr
IS NOT NULLは何とか影響しません。私はIDを取得するために2つの整数でグループ化しています。サブクエリはこれらのIDの詳細を取得するだけです。 – Eugen
しかし、あなたはそれらを必要としません。代わりに 'CustomerBase'テーブルに参加することができます。また、クエリを実行した結果が異なっている、または生成されたSQLが異なっていると言っていますか?それが結果ならば、正確にどのように違いますか? – juharr