2014-01-06 3 views
0

У меня есть класс, который содержит категории.Добавить список элементов, используя linq

public class CategoryDto 
{ 
    public int Id { get; set; } 
    public int PortfolioId { get; set; } 
    public string Description { get; set; } 
    public List<SubCategoryDto> SubCategories { get; set; } 

    public CategoryDto() 
    { 
     SubCategories = new List<SubCategoryDto>(); 
    } 
} 

Он имеет список в нем, который представляет собой список классов подкатегории:

public class SubCategoryDto 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 
    public CategoryDto Category { get; set; } 
    public string Description { get; set; } 
} 

я затем заполнить этот пункт, но я получаю список баз на «PortfolioId».

var cats = (from p in Context.transaction_category 
        where p.account_portfolio_id == portfolioId 
          && p.deleted == null 
        select new CategoryDto 
         { 
          Id = p.id, 
          Description = p.description, 
          PortfolioId = p.account_portfolio_id 
         }).ToList(); 

Таблица категорий имеет внешний ключ для подкатегорий. Каждая категория имеет 0: n подкатегорий. Таким образом, модель структуры сущности имеет коллекцию Context.transaction_category.transaction_sub_categories.

Итак, теперь я делаю это, просматривая категории в приведенном выше списке и заполняю подкатегории.

Есть ли способ сделать это в том же заявлении о ссылках? Объект Category имеет список List. Можно ли это сделать в приведенном выше выражении Linq?

Edit: Это исправление попытка, как это было рекомендовано, но представляет ошибку:

var cats = (from p in Context.transaction_category 
         where p.account_portfolio_id == portfolioId 
           && p.deleted == null 
         select new CategoryDto 
          { 
           Id = p.id, 
           Description = p.description, 
           PortfolioId = p.account_portfolio_id, 
           SubCategories = (from s in Context.transaction_sub_category where s.transaction_category_id == p.id 
               && s.deleted == null 
                select new SubCategoryDto 
                 { 
                  Id = s.id, 
                  Description = s.description, 
                  CategoryId = s.transaction_category_id 
                 }).ToList() 
          }).ToList(); 

LINQ to Entities does not recognize the method 'System.Collections.Generic.List 1[Objects.SubCategoryDto] ToList[SubCategoryDto](System.Collections.Generic.IEnumerable 1[Objects.SubCateg‌​oryDto])' method, and this method cannot be translated into a store expression.

+0

, где есть ваши подкатегории? и можете ли вы поделиться своим классом подкатегорий? –

+1

Добавлен класс SubCategory для публикации. – Craig

ответ

1

Вы можете сделать это следующим образом:

var cats = (from p in Context.transaction_category 
       where p.account_portfolio_id == portfolioId 
         && p.deleted == null 
       select new CategoryDto 
        { 
         Id = p.id, 
         Description = p.description, 
         PortfolioId = p.account_portfolio_id, 
         SubCategories = (from s in Context.transaction_category.transaction_sub_categories 
          where s.CategoryId == p.Id 
           select new SubCategoryDto { 
            Id = s.Id, 
            Description = s.Decription  
         }).ToList() 
        }).ToList(); 

Update: Для того, чтобы это проще изменить ваши SubCategories и Category свойства, подобные этому:

public virtual List<SubCategoryDto> SubCategories { get; set; } 

public virtual CategoryDto Category { get; set; } 

Затем вы можете использовать, включают и просто загрузить свои подкатегорий следующим образом:

var cats = Context.transaction_category 
       .Where(p => p.account_portfolio_id == portfolioId && p.deleted == null) 
       .Include(p => p.SubCategories); 
+0

Спасибо. Это должно сработать. Просто из интереса ... заставит SQL сделать какой-то вспомогательный запрос (замедленный) или использовать INNER JOIN для получения данных связанных подпроцессов? – Craig

+0

Я не уверен, что вы можете проверить это с помощью sql-профилировщика –

+0

Нет, это не так. Он будет делать обратную связь с базой данных каждый раз, когда вы создадите/выберите 'CategoryDto'. Поэтому, если у вас есть 100 категорий, вы будете поражать базу данных 101 раз – Leo

Смежные вопросы