2011-05-11 3 views
0

Je rencontre des problèmes lors de la définition d'une propriété de liste générique d'un objet POCO à partir d'un contexte EF. Par exemple, j'ai un objet très simple qui contient les éléments suivants:Entity Framework - Sélection LINQ dans la propriété Liste POCO générique

public class foo 
{ 
    public string fullName; 
    public Entity entity; 
    public List<SalesEvent> eventList; 
} 

Mon code pour remplir cet objet de ressemble à ceci:

.Select(x => new foo() 
       { 
        fullName = x.vchFirstName + " " + x.vchLastName, 
        entity = new EntityVo() 
        { 
         address1 = x.vchAddress1, 
         entityId = x.iEntityId, 
         emailAddress = x.vchEmailAddress, 
         firstName = x.vchFirstName, 
         lastName = x.vchLastName, 
         city = x.vchCity, 
         state = x.chState, 
         workNumber = x.vchWorkNumber, 
         mobileNumber = x.vchMobileNumber, 
         siteId = x.iSiteId 

        } 
        eventList = _context.Events 
           .Where(e => e.iEntityId == x.iEntityId 
             && e.iStatusId >= eventStatusMin 
             && e.iStatusId <= eventStatusMax) 
           .Select(e => new List<SalesEventMatchVo> 
              { 
               new SalesEventMatchVo() 
                { 
                vehicleName = _context.Quotes.Select(q=>q).Where(q=>q.iEventId == e.iEventId).FirstOrDefault().vchMake + " " + _context.Quotes.Select(q=>q).Where(q=>q.iEventId == e.iEventId).FirstOrDefault().vchModel, 
                eventId = e.iEventId, 
                salesPerson = e.chAssignedTo, 
                eventStatusDesc=_context.RefDefinitions.Select(r=>r).Where(r=>r.iParameterId==e.iStatusId).FirstOrDefault().vchParameterDesc, 
                eventStatusId =(int)e.iStatusId, 
                eventSourceDesc=_context.RefDefinitions.Select(r=>r).Where(r=>r.iParameterId==e.iSourceId).FirstOrDefault().vchParameterDesc, 
                createDate = e.dtInsertDate 

                } 
              }).FirstOrDefault() 
       }).ToArray(); 

Ce problème que je vais avoir est que je suis impossible de remplir la propriété eventList avec tous les événements, il saisit uniquement le premier enregistrement (ce qui est logique en regardant le code). Je ne peux pas sembler comprendre pour remplir la liste entière.

Répondre

2

Y a-t-il une raison pour simplement supprimer le FirstOrDefault à la fin n'est pas la solution ici? J'ai l'impression de mal comprendre quelque chose.

EDIT:

Je pense que je vois ce que vous essayez de faire. Le problème est que vous créez une liste dans l'instruction select, lorsque l'instruction select ne fonctionne que sur une seule chose à la fois. Il s'agit essentiellement de mapper un type d'entrée à un nouveau type de sortie.

Essayez quelque chose comme ceci:

eventList = _context.Events.Where(e => e.iEntityId == x.iEntityId &&  //FILTER EVENTS 
             e.iStatusId >= eventStatusMin && 
             e.iStatusId <= eventStatusMax) 
          .Select(e => new SalesEventMatchVo()   //MAP TO SALESEVENT 
             { 
              vehicleName = _context.Quotes.Select(q=>q).Where(q=>q.iEventId == e.iEventId).FirstOrDefault().vchMake + " " + _context.Quotes.Select(q=>q).Where(q=>q.iEventId == e.iEventId).FirstOrDefault().vchModel, 
              eventId = e.iEventId, 
              salesPerson = e.chAssignedTo, 
              eventStatusDesc=_context.RefDefinitions.Select(r=>r).Where(r=>r.iParameterId==e.iStatusId).FirstOrDefault().vchParameterDesc, 
              eventStatusId =(int)e.iStatusId, 
              eventSourceDesc=_context.RefDefinitions.Select(r=>r).Where(r=>r.iParameterId==e.iSourceId).FirstOrDefault().vchParameterDesc, 
              createDate = e.dtInsertDate 
             }) 
          .ToList() //CONVERT TO LIST 

Comme une note de côté, à moins que vous avez réellement besoin d'un List pour une raison quelconque, je stocker foo.eventList comme IEnumerable<SalesEvent> à la place. Cela vous permet de passer la conversion List à la fin, et dans certains scénarios permet des astuces soignées comme l'exécution retardée et/ou partielle.

En outre, je ne sais pas quel est le point de vos instructions .Select(q=>q) sont dans plusieurs lignes de l'initialiseur SalesEventMatchVo, mais je suis sûr que vous pouvez les couper. Si rien d'autre, vous devriez Select après Where, comme Where peut réduire le travail effectué par toutes les déclarations suivantes.

+0

Génial ... merci pour la solution et les conseils supplémentaires! – Kbanashek