Коллекция запросов EF Linq с загруженной дочерней коллекцией

Сначала я использую код EF4.1,

Я пытаюсь создать запрос, который возвращает коллекцию с загруженной дочерней коллекцией. Оба должны быть упорядочены по Положению и IsActive == true.

Эти классы сопоставлены.

public class Type
{
    public int Id { get; set; }
    public int AreaId { get; set; }
    public bool IsActive { get; set; }
    public int Position { get; set; }
    .......
    public virtual IList<Category> Categories { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public int TypeId { get; set; }
    public bool IsActive { get; set; }
    public int Position { get; set; }
    .......
    public virtual Type Type { get; set; }
}

DTO:

    public class TypeDTO
    {
        public string Name { get; set; }
        public string UniqueName { get; set; }
        public virtual IList<CategoryDTO> Categories { get; set; }
    }

public class CategoryDTO
    {
        public string Name { get; set; }
        public string UniqueName { get; set; }

        public virtual TypeDTO Type { get; set; }
    }

Что у меня есть:

С ДТО:

var result = _db.Types
                             .Where(x => x.IsActive == true)
                             .Where(x => x.AreaId== areaId)
                             .Select(x => new TypeDTO()
                             {
                                 Name = x.Name,
                                 UniqueName = x.UniqueName,
                                 Categories = x.Categories.Where(c => c.IsActive == true)
                                                          .OrderBy(c => c.Position)
                                                          .Select(c => new CategoryDTO()
                                                          {
                                                              Name = c.Name,
                                                              UniqueName = c.UniqueName
                                                          })
                                                          .ToList()

                             })
                             .ToList();

Это бросает:

LINQ to Entities не распознает метод System.Collections.Generic.List1[...CategoryDTO] ToList[...CategoryDTO](System.Collections.Generic.IEnumerable1[...CategoryDTO])', и этот метод нельзя преобразовать в выражение хранилища.

Без ДТО:

var result2 = _db.Categories
                           .Where(x => x.IsActive == true)
                           .OrderBy(x => x.Position)
                           .Select(x => x.Type)
                           .Distinct()
                           .Where(x => x.IsActive == true && x.AreaId== areaId)
                           .OrderBy(x => x.Position)
                           .ToList();

Он работает без ошибок, но не дает правильного результата и не упорядочивает дочернюю коллекцию.

Другой неудачный подход:

var result = _db.Types
                           .Where(t => t.IsActive == true)
                           .Where(t => t.SiteId == siteId)
                           .Include(t => t.Categories
                                              .Where(c=>c.IsActive == true)
                                              .OrderBy(c=>c.Position))
                           .OrderBy(t => t.Position)
                           .ToList();

Что мне не хватает?

Спасибо.

ИЗМЕНИТЬ Окончательное решение:

public class TypeDTO
    {
        public Type Type { get; set; }
        public IEnumerable<Category> Categories { get; set; }
    }

var result = _db.Types
                .Where(x => x.IsActive == true)
                .Where(x => x.AreaId== areaId)
                .OrderBy(x=>x.Position)
                .Select(x => new TypeDTO()
                {
                   Type = x,
                   Categories =  x.Categories.Where(c => c.IsActive == true).OrderBy(c => c.Position)
                })
                .ToList();

person jani    schedule 22.07.2011    source источник


Ответы (1)


Вы можете использовать следующий подход.

using (var context = new DbContext())
{
     var activeTypes = context.Types.Where(t => t.IsActive)
                             .Select(t => new 
                             {
                                 Type= t,
                                 ActiveCategories = t.Categories.Where(c => c.IsActive)
                                                                .OrderBy(c => c.Position)
                             }).ToList();


}
person Amitabh    schedule 22.07.2011
comment
Спасибо за ваш ответ, но типы должны быть списком, а не записью - person jani; 22.07.2011
comment
Спасибо, отредактированная версия работает. Мне нужно было обновить класс DTO:**public class TypeDTO { public Type Type { get; задавать; } public IEnumerable‹Category› Categories { get; задавать; } }** - person jani; 22.07.2011