2009-09-13 6 views
0

Я новичок в Linq для Entity, поэтому я не знаю, подходит ли то, что я делаю, лучший подход.Как написать этот запрос Linq to Entity?

Когда я делаю такой запрос, он компилируется, но выдает ошибку, что он не распознает метод GetItemSummaries. Выглядя, похоже, это потому, что он не любит настраиваемый метод внутри запроса.

return (from c in _entity.Category 
       from i in c.Items 
       orderby c.Id, i.Id descending 
       select new CategoryDto 
       { 
        Id = c.Id, 
        Name = c.Name, 
        Items = GetItemSummaries(c) 
       }).ToList(); 

private IEnumerable<ItemSummary> GetItemSummaries(CategoryDto c) 
{ 
    return (from i in c.Items 
      select new ItemSummary 
      { 
       // Assignment stuff 
      }).ToList(); 
} 

Как бы объединить это в один запрос, так как я не могу вызвать пользовательский метод?

Я попытался просто заменить вызов метода фактическим запросом, но затем он жалуется, что ItemSummary не распознается, а не жалуется, что имя метода не распознается. Есть какой-либо способ сделать это? (Или лучше?)

ответ

2

Вы должны быть в состоянии сделать следующее:

return (
      from c in _entity.Category 
      orderby c.Id descending 
      select new CategoryDto 
      { 
       Id = c.Id, 
       Name = c.Name, 
       Items = (
        from i in c.Items 
        order by i.Id descending 
        select new ItemSummary 
        { 
         // Assignment stuff 
        } 
       ) 
      }).ToList(); 

Это просто вопрос, чтобы ItemSummary был общедоступным, чтобы он был видимым для запроса.

Если это только DTO, хотя, вы можете использовать тип Анон, например:

    from i in c.Items 
        order by i.Id descending 
        select new 
        { 
         Id = i.Id, 
         Name = i.Name 
        } 

Это создает тип с «Id» и свойства «Name». Все зависит от вашего потребляющего кода :)

0

Попробуйте сделать метод GetItemSummaries метод расширения на Category класса

private static IEnumerable<ItemSummary> GetItemSummaries(this Category c) 

, а затем вызвать его с

select new Category 
      { 
       Id = c.Id, 
       Name = c.Name, 
       Items = c.GetItemSummaries() 
      }).ToList(); 

Marc

+0

Извините, это всего лишь учебное приложение, так что мои наречия вроде ленивы. Возвращаемая категория I - это объект Dto, созданный из объекта сущности, я не думаю, что могу сделать метод расширения в классе Dto и заставить его делать то, что я хочу. – Brandon

+0

почему нет? вы можете поместить метод расширения на любой объект, если объект «Категория» содержит всю необходимую информацию в методе GetItemSummaries - без проблем. –

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