I am trying to convert this query using linq query syntax to method based syntax.
Here's the request:
var products = from p in context.Products join t in context.TopSellings on p.Id equals t.Id into g from tps in g.DefaultIfEmpty() orderby tps.Rating descending select new { Name = p.Name, Rating = tps.Rating == null ? 0 : tps.Rating };
The query above creates this sql query:
{SELECT [Project1].[Id] AS [Id], [Project1].[Name] AS [Name], [Project1].[C1] AS [C1] FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], CASE WHEN ([Extent2].[Rating] IS NULL) THEN 0 ELSE [Extent2].[Rating] END AS [C1], [Extent2].[Rating] AS [Rating] FROM [dbo].[Products] AS [Extent1] LEFT OUTER JOIN [dbo].[TopSellings] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id] ) AS [Project1] ORDER BY [Project1].[Rating] DESC}
So far I have tried something like this:
var products = context.Products .Join(inner: context.TopSellings.DefaultIfEmpty(), outerKeySelector: c => c.Id, innerKeySelector: y => y.Id, resultSelector: (j, k) => new { Name = j.Name, Rating = k.Rating == null ? 0 : k.Rating }) .OrderByDescending(p => p.Rating);
and this creates another sql query (which, of course, has a different meaning with respect to how the data is used in the program):
{SELECT [Project1].[Id] AS [Id], [Project1].[Name] AS [Name], [Project1].[C1] AS [C1] FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], CASE WHEN ([Join1].[Rating] IS NULL) THEN 0 ELSE [Join1].[Rating] END AS [C1] FROM [dbo].[Products] AS [Extent1] INNER JOIN (SELECT [Extent2].[Id] AS [Id], [Extent2].[Rating] AS [Rating] FROM ( SELECT 1 AS X ) AS [SingleRowTable1] LEFT OUTER JOIN [dbo].[TopSellings] AS [Extent2] ON 1 = 1 ) AS [Join1] ON [Extent1].[Id] = [Join1].[Id] ) AS [Project1] ORDER BY [Project1].[C1] DESC}
Your answers will be of great help and will be very grateful!