Entity Framework Core объединяет и включает внутренние сущности - PullRequest
1 голос
/ 05 ноября 2019
 List<Item> Item = (from it in _context.Item
                    join iv in _context.ItemVersions on it.Id equals iv.ItemId
                    join iot in _context.ItemOriginalTitles on iv.Id equals iot.ItemVersionId                    
                    where term.ToLower() == "all" || (it.Name.ToLower() == term.ToLower() || it.Name.ToLower().Contains(term.ToLower()) || iot.Value.Contains(term) || 
                    queryable.Any(x => iot.Value.Contains(x.SearchText)))
                    select new Item
                    {
                        Id = it.Id,
                        Name = it.Name,
                        TypeCodeId = it.TypeCodeId,
                        TypeCode = it.TypeCode,
                        OriginalLangId = it.OriginalLangId,
                        SubGenreCodeId = it.SubGenreCodeId,
                        ItemVersions = it.ItemVersions
                    }
                ).Include("ItemVersions.OriginalTitles").ToList();

Я пытаюсь добавить OriginalTitles к ItemVersions сущности, как вы можете видеть, но не могу этого сделать (OriginalTitles всегда null). Модель элемента:

public class Item
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int TypeCodeId { get; set; }
    public TypeCodes TypeCode { get; set; }
    public int? OriginalLangId { get; set; }
    public int SubGenreCodeId { get; set; }
    public List<ItemVersion> ItemVersions { get; set; }      
}

и моя модель ItemVersions:

 public class ItemVersion
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public List<ItemOriginalTitle> OriginalTitles { get; set; }
        public List<ItemShortTitle> ShortTitles { get; set; }
        public List<ItemSynopsis> ItemSynopsis { get; set; }
        public List<ItemLongSynopsis> ItemLongSynopsis { get; set; }
        public List<ItemLanguage> ItemLanguages { get; set; }
        public List<VersionChannel> VersionChannels { get; set; }
        public bool IsDefault { get; set; }
        public Item Item { get; set; }
        public int ItemId { get; set; }
    }

Ищите способ включить его сразу, без необходимости повторять его, если это возможно. Спасибо

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Try (метод Include перемещен в предложение join, где выбрана таблица):

List<Item> Item = from it in _context.Item
                  join iv in _context.ItemVersions.Include("OriginalTitles") on it.Id equals iv.ItemId
                  join iot in _context.ItemOriginalTitles on iv.Id equals iot.ItemVersionId                    
                  where term.ToLower() == "all" || (it.Name.ToLower() == term.ToLower() || it.Name.ToLower().Contains(term.ToLower()) || iot.Value.Contains(term) || 
                  queryable.Any(x => iot.Value.Contains(x.SearchText)))
                  select new Item
                  {
                      Id = it.Id,
                      Name = it.Name,
                      TypeCodeId = it.TypeCodeId,
                      TypeCode = it.TypeCode,
                      OriginalLangId = it.OriginalLangId,
                      SubGenreCodeId = it.SubGenreCodeId,
                      ItemVersions = it.ItemVersions
                  };
0 голосов
/ 05 ноября 2019

Поскольку я инициализировал новый объект, не имеет значения, что я включил внутренние объекты. Мое решение состояло в том, чтобы вернуть объект db и переместить в него включения:

  Item = (from it in _context.Item.Include("ItemVersions.OriginalTitles")
                join iv in _context.ItemVersions on it.Id equals iv.ItemId
                join iot in _context.ItemOriginalTitles on iv.Id equals iot.ItemVersionId
                where term.ToLower() == "all" || (it.Name.ToLower() == term.ToLower() || it.Name.ToLower().Contains(term.ToLower()) || iot.Value.Contains(term) ||
                queryable.Any(x => iot.Value.Contains(x.SearchText)))
                select it          
       ).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...