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