I'm trying to write in C# a query with left join using Lambda Expression.
How can i get the wanted SQL query when i have a filter in the joined table.
I mean without subquery, with multiple verifications on 'ON' statement
public class Article
{
public int Id { get; set; }
public string ArticleName { get; set; }
// EF navigation property
public ICollection<UserArticleNames> UserArticleNames { get; set; }
}
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
}
public class UserArticleName
{
// FK Users
public int UserId { get; set; }
// FK Articles
public int ArticleId { get; set; }
public int UserArticleName { get; set; }
}
EF - LINQ query via navigation property: (get Articles for an user)
var join = context.Articles
.SelectMany(a => a.UserArticleNames
.Where(ua => ua.UserId == 1)
.DefaultIfEmpty(), (a, ua) => new {
Id = a.Id,
ArticleName = a.ArticleName ,
UserArticleName = ua.UserArticleName,
}
);
Resulting SQL code:
SELECT [a].[Id],
[a.ArticleName],
[ua].[UserArticleName]
FROM [dbo].[Articles] AS [a]
LEFT JOIN (
SELECT [a0].[UserId],
[a0].[ArticleId],
[a0].[UserArticleName],
FROM [dbo].[UserArticleName] AS [a0]
WHERE [a0].[UserId] = 1
) AS [ua] ON [a].[Id] = [ua].[Id]
Wanted SQL code:
SELECT [a].[Id],
[a.ArticleName],
[ua].[UserArticleName]
FROM [dbo].[Articles] AS [a]
LEFT JOIN [dbo].[UserArticleName] AS [ua]
ON [a].[Id] = [ua].[Id] AND [ua].[UserId] = 1