Linq to Sql отличается от левого соединения, лямбда - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь переписать приведенный ниже запрос в оператор Linq.Запрос должен вернуть список объектов «Пользователь», содержащий четыре свойства (Id, FirstName, LastName, Email).

SELECT DISTINCT Id, FirstName, LastName, Email FROM User
LEFT JOIN Booklet ON Booklet.UserId = User.Id
WHERE Booklet.YearReleased = @YearOfRelease 
ORDER BY LastName ASC

Теперь у меня есть что-то подобное, но Group by неверна, и все этоне очень хорошо выглядит кодирование ... я чувствую, что это можно много оптимизировать в одно утверждение, но я не могу этого сделать.(демонстрационный год '18').

List<User> = new List<User>();

List<int?> lstUserIds = db.Booklet.GroupBy(x => x.UserId && x.YearReleased)
                                  .Where(x => x.YearReleased == 18)
                                  .OrderBy(x => x.LastName)
                                  .Select(x => x.UserId)
                                  .ToList();

foreach (int iUserId in lstUserIds )
    lst.Add(db.User.First(x => x.Id == iUserId));

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Я бы использовал соединение, чтобы получить левое внешнее соединение:

List<int?> lstUserIds = (from b in db.Booklet.Where(x => x.YearReleased == 18)
    join on u in User on b.Id equal u.Id into ids
    from id in ids.DEfaultIfEmpty
    select new { user = u, books = b})
    .OrderBy(x => x.user.LastName)
    .GroupBy(x -> x.user.UserId)
    .Select(x => x.FirstOrDefault())
    .ToList();
0 голосов
/ 14 мая 2018

Если вы используете Any(), вам не нужно ни отдельного, ни левого соединения с буклетом.

var users = db.User
             .Where(u => db.Booklet.Any(b => u.Id == b.UserId && b.YearReleased == 18))
             .OrderBy(u => u.LastName);
0 голосов
/ 14 мая 2018

Тр это:

List<User> lst = db.User.Include(B => B.Booklet)
                        .Where(B => B.YearReleased == 18)
                        .OrderBy(x => x.LastName)
                        .Distinct()
                        .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...