Возьмите один и пропустите другой дубликат в дочернем столе. - PullRequest
0 голосов
/ 16 октября 2018

У меня есть список Предметов, и у каждого предмета есть какой-то список, Теперь я хочу выбрать Отдельные предметы от ребенка.Я пробовал, как показано ниже, но это не работает.

var items = await _context.Items.
Include(i => i.Tags.Distinct()).
Include(i => i.Comments).
OrderBy(i => i.Title).ToListAsync();

//Tag items
TagId    -   tag
------------------
  1   ---   A 
  2   ---   B 
  3   ---   B 
  4   ---   C 
  5   ---   D 
  6   ---   D 
  7   ---   F
//Expected Result
Item.Tags -> [A,B,C,D,F]

как я могу сделать это в EF Core?Спасибо.

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Очевидно, у вас есть таблица Items, где каждый Item имеет ноль или более Tags.Кроме того, Items имеет свойство Comments, из которого мы не знаем, является ли это одной строкой или набором из нуля или более строк.Более того, каждый Item имеет Title.

. Теперь вам нужны все свойства Предметов, каждый со своим Comments и списком уникальных Tags предметов.Упорядочено по Title

Одна из более медленных частей запросов к базе данных - это передача выбранных данных из системы управления базами данных в локальный процесс.Следовательно, разумно ограничить объем данных до минимума, который вы действительно используете.

Кажется, что Tags из Items находятся в отдельной таблице.Каждый Item имеет ноль или более Tags, каждый Tag принадлежит ровно одному предмету.Простое отношение один-ко-многим с внешним ключом Tag.ItemId.

Если Item с Id 300 имеет 1000 Tags, то вы знаете, что каждый из этих 1000 Tags имеетвнешний ключ ItemId, который, как вы знаете, имеет значение 300. Какая трата, если вы перенесете все эти внешние ключи в локальный процесс.

Всякий раз, когда вы запрашиваете данные для проверкиSelect только свойства, которые вы действительно планируете использовать.Используйте Include только если вы планируете обновить включенный элемент.

Таким образом, ваш запрос будет:

var query = myDbContext.Items
    .Where(item => ...)                // only if you do not want all items
    .OrderBy(item => item.Title)       // if you Sort here and do not need the Title
                                       // you don't have to Select it
    .Select(item => new
    {   // select only the properties you plan to use
        Id = item.Id,
        Title = item.Title,
        Comments = item.Comments,      // use this if there is only one item, otherwise
        Comments = item.Comments       // use this version if Item has zero or more Comments
           .Where(comment => ...)      // only if you do not want all comments
           .Select(comment => new
           {   // again, select only the Comments you plan to use
               Id = comment.Id,
               Text = comment.Text,

               // no need for the foreign key, you already know the value:
               // ItemId = comment.ItemId,
           })
           .ToList();

           Tags = item.Tags.Select(tag => new
           {   // Select only the properties you need
               Id = tag.Id,
               Type = tag.Type,
               Text = tag.Text,

               // No need for the foreign key, you already know the value
               // ItemId = tag.ItemId,
           })
           .Distinct()
           .ToList(),
     });

var fetchedData = await query.ToListAsync();
0 голосов
/ 18 октября 2018

Я не пробовал, но я бы сказал, что вы поставили .Distinct () не в том месте.

var items = await _context.Items
        .Include(i => i.Tags)
        .Include(i => i.Comments).
        .OrderBy(i => i.Title)
        .Select(i => { i.Tags = i.Tags.GroupBy(x => x.Tag).Select(x => x.First()); return i; })
        .ToListAsync();
0 голосов
/ 16 октября 2018

Вы можете использовать библиотеку MoreLinq , чтобы получить DistinctBy или написать свою собственную, используя этот пост .

Затем используйте это:

var items = await _context.Items.
    Include(i => i.Tags).
    Include(i => i.Comments).
    OrderBy(i => i.Title).
    DistinctBy(d => d.Tags.tag).
    ToListAsync();

Вы хотите получить отдельные записи на основе одного столбца;так что должен это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...