开发者

Entity Framework - LINQ selection in POCO generic List property

I'm having some issues setting a generic list property of a POCO object when from an EF context. For instance I have a very simple object that contains the following:

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

My code to populate this object from looks something like this:

  .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()
                                                   {
                                                     vehicleNam开发者_运维知识库e = _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();

This issue I'm having is that I'm unable to populate the eventList property with all of the events, it's only grabbing the first record(which makes sense looking at the code). I just cant seem to figure out to populate a the entire list.


Is there a reason simply removing the FirstOrDefault at the end isn't the solution here? I feel like I might be misunderstanding something.

EDIT:

I think I see what you are trying to do. The issue is that you are creating a list in the select statement, when the select statement works only over one thing at a time. It is basically mapping an input type to a new output type.

Try something like this instead:

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

As a side note, unless you actually need a List for some reason, I would store foo.eventList as IEnumerable<SalesEvent> instead. This allows you to skip the List conversion at the end, and in some scenarios enables neat tricks like delayed and/or partial execution.

Also, I'm not sure what the point of your .Select(q=>q) statements are in several lines of the SalesEventMatchVo initializer, but I'm pretty sure you can chop them out. If nothing else, you should Select after Where, as Where can reduce the work performed by all following statements.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜