Линк и левый присоединиться - PullRequest
0 голосов
/ 12 июня 2019

У меня есть следующие модели:

public class UserPage
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsSelected { get; set; }
    public string Path { get; set; }
    public string Icon { get; set; }
}

и

public class UserPageSetting
{
    public int UserId { get; set; }
    public int PageId { get; set; }
    public bool Active { get; set; } = true;
    public bool Published { get; set; } = true;
    public DateTime? Modified { get; set; }

    public virtual UserPage UserPage { get; set; }
}

UserPage коллекция имеет 5 записей, UserPageSetting имеет 1 запись. Мне нужен результат с 5 записями и значениями по умолчанию для несуществующих записей.

Я пытаюсь сделать это:

var list = (from userPage in _dbContext.UserPages
           join userPageSetting in _dbContext.UserPageSettings on userPage.Id equals userPageSetting.PageId
           into gj
            from subUserPageSetting in gj.DefaultIfEmpty()
            where subUserPageSetting.UserId == userId
           select new UserPageSettingDto { Active = subUserPageSetting.Active, Modified = subUserPageSetting.Modified, Id = userPage.Id, Icon = userPage.Icon, IsSelected = userPage.IsSelected,
               Name = userPage.Name, Path = userPage.Path, Published = subUserPageSetting.Published
           }).ToList();

но в результате я вижу только одну запись. Что не так в моем коде?

1 Ответ

0 голосов
/ 12 июня 2019

Вот пример того, как выполнить левое соединение и создать UserPageSetting по умолчанию, если соединение не удалось. Это вернет 5 записей; 1 за каждый UserPage. У одного из них будет успешное объединение, обозначенное Active = true

void Main()
{
    var inner = new List<UserPage> {
        new UserPage { Id = 1, Name = "One" },
        new UserPage { Id = 2, Name = "Two" },
        new UserPage { Id = 3, Name = "Three" },
        new UserPage { Id = 4, Name = "Four" },
        new UserPage { Id = 5, Name = "Five" }};

    var outer = new List<UserPageSetting> {
        new UserPageSetting { UserId = 1, PageId = 1, Active = true, Published = true }};

    var joined = inner
        .GroupJoin(outer, i => i.Id, o => o.PageId, (i, o) => o
               .Select(x => new { Inner = i, Outer = x })
               .DefaultIfEmpty(new { Inner = i, Outer = new UserPageSetting {UserId = i.Id, PageId = i.Id, Active = false, Published = false } }))
        .SelectMany(x => x)
        //.Where(x => x.Outer == -1) -- include if you only want to see the join misses
        ;

    foreach (var x in joined)
    {
        Console.WriteLine($"UserPage({x.Inner.Id}, {x.Inner.Name}) joined to UserPageSetting({x.Outer.UserId}, {x.Outer.Active})");
    }
}

Будет выведено следующее:

UserPage(1, One) joined to UserPageSetting(1, True)
UserPage(2, Two) joined to UserPageSetting(2, False)
UserPage(3, Three) joined to UserPageSetting(3, False)
UserPage(4, Four) joined to UserPageSetting(4, False)
UserPage(5, Five) joined to UserPageSetting(5, False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...