Projection LINQ to Entities de la liste imbriquée

c# entity entity-framework linq-to-entities

Question

En supposant que ces objets ...

class MyClass
{
     int ID {get;set;}
     string Name {get;set;}
     List<MyOtherClass> Things {get;set;}
}

class MyOtherClass
{
     int ID {get;set;}
     string Value {get;set;}
}

Comment effectuer une requête LINQ to Entities, en utilisant une projection comme celle présentée ci-dessous, qui me donnera une liste? Cela fonctionne bien avec un IEnumerable (en supposant que MyClass.Things est un IEnumerable, mais je dois utiliser la liste).

MyClass myClass = (from MyClassTable mct in this.Context.MyClassTableSet
                        select new MyClass
                        {
                             ID = mct.ID,
                             Name = mct.Name,
                             Things = (from MyOtherClass moc in mct.Stuff
                                       where moc.IsActive
                                       select new MyOtherClass
                                       {
                                            ID = moc.ID,
                                            Value = moc.Value
                                       }).AsEnumerable()
                        }).FirstOrDefault();

Merci d'avance pour l'aide!

Réponse acceptée

Vous pas. Vous devez faire cette partie en L2O.

Alors tu pourrais faire:

var q = (from MyClassTable mct in this.Context.MyClassTableSet
         select new // note anonymous type; important!
         {
             ID = mct.ID,
             Name = mct.Name,
             Things = (from MyOtherClass moc in mct.Stuff
                       where moc.IsActive
                       select new MyOtherClass
                       {
                           ID = moc.ID,
                           Value = moc.Value
                       }
          }).AsEnumerable();

MyClass myClass = (from mct in q
                   select new MyClass
                   {                 
                       ID = mct.ID,
                       Name = mct.Name,
                       Things = mct.Things.ToList()
                   }).FirstOrDefault();

Il n'y a aucun moyen de faire cela dans une requête.


Réponse populaire

Je ne sais pas exactement ce que vous demandez, mais List<T> implémente IEnumerable<T> (qui est simplement une interface pour une séquence énumérable).

Un code qui fera votre projection et qui fera de Things une liste au lieu d'un IEnumerable utiliserait l'opérateur ToList (), qui crée un List<T> partir de tout IEnumerable<T> ceci:

MyClass myClass = (from MyClassTable mct in this.Context.MyClassTableSet
                        select new MyClass
                        {
                             ID = mct.ID,
                             Name = mct.Name,
                             Things = (from MyOtherClass moc in mct.Stuff
                                       where moc.IsActive
                                       select new MyOtherClass
                                       {
                                            ID = moc.ID,
                                            Value = moc.Value
                                       }).ToList()
                        }).FirstOrDefault();


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow