2011-07-22 4 views
1

J'utilise le code EF4.1 premier,EF Linq Collection requête avec une charge avide enfant collection

Je suis en train de créer une requête qui retourne une collection avec une charge avide enfant collection. deux doit être commandé par Position et IsActive == true

Ces classes sont mises en correspondance.

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; } 
    } 

Ce que j'ai:

Avec DTO:

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(); 

Ce Lancers:

LINQ to En La méthode ne reconnaît pas la méthode 'System.Collections.Generic.List 1[...CategoryDTO] ToList[...CategoryDTO](System.Collections.Generic.IEnumerable 1 [... CategoryDTO])' méthode, et cette méthode ne peut pas être traduite dans une expression de magasin.

Sans DTO:

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(); 

Il fonctionne sans erreur, mais ne donne pas le bon résultat, et ne commande pas l'enfant-collection

Autre approche infructueuse:

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(); 

Que manque-t-je?

Merci.

EDIT La solution finale:

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(); 

Répondre

2

Vous pouvez utiliser l'approche suivante ..

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(); 


} 
+0

Merci pour votre réponse, mais ** types ** doit être une liste pas une entrée – jani

+0

Merci, la version éditée fonctionne. J'avais besoin de mettre à jour la classe DTO: ** public class TypeDTO { public Type Type {get; ensemble; } public IEnumerable Catégories {get; ensemble; } } ** – jani

Questions connexes