Как мне написать этот запрос Linq to 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 не распознается, а не жалуется, что имя метода не распознается. Есть какой-либо способ сделать это? (Или лучше?)


person Brandon    schedule 13.09.2009    source источник


Ответы (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». Все зависит от того, что нужно вашему потребляющему коду :)

person Timothy Walters    schedule 13.09.2009

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

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

а затем вызовите его с помощью

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

Марк

person marc_s    schedule 13.09.2009
comment
Извините, это всего лишь обучающее приложение, поэтому мои имена немного ленивы. Категория, которую я возвращаю, представляет собой объект Dto, созданный из объекта сущности, я не думаю, что смогу создать метод расширения для класса Dto и заставить его делать то, что я хочу. - person Brandon; 13.09.2009
comment
Почему нет? вы можете добавить метод расширения к любому объекту — если ваш объект категории содержит всю необходимую информацию в методе GetItemSummaries — нет проблем. - person marc_s; 13.09.2009