实体框架 - POCO通用List属性中的LINQ选择

时间:2011-05-11 22:58:44

标签: linq entity-framework generics collections

我在从EF上下文设置POCO对象的通用列表属性时遇到了一些问题。例如,我有一个非常简单的对象,其中包含以下内容:

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

我填充此对象的代码看起来像这样:

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

我遇到的这个问题是我无法用所有事件填充eventList属性,它只抓取第一条记录(这看起来很合理)。我似乎无法想出填充整个列表。

1 个答案:

答案 0 :(得分:2)

有没有理由只是在最后删除FirstOrDefault不是解决方案?我觉得我可能会误解某些东西。

编辑:

我想我明白你要做什么了。问题是,当select语句一次只能处理一件事时,您正在select语句中创建一个列表。它基本上是将输入类型映射到新的输出类型。

尝试这样的事情:

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

作为旁注,除非您出于某种原因确实需要List,否则我会将foo.eventList存储为IEnumerable<SalesEvent>。这允许您在最后跳过List转换,并且在某些情况下可以启用延迟和/或部分执行等巧妙的技巧。

另外,我不确定.Select(q=>q)语句在SalesEventMatchVo初始化程序的几行中的含义是什么,但我很确定你可以将它们删除。如果不出意外,您应Select之后Where,因为Where可以减少以下所有声明所执行的工作。