2011-05-11 82 views
0

从EF上下文中,我有一些问题设置POCO对象的泛型列表属性。比如我有一个包含以下一个非常简单的对象:实体框架 - POCO泛型列表属性中的LINQ选择

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属性,它只抓取第一条记录(这有意义看代码)。我似乎不知道要填充整个列表。

回答

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.eventListIEnumerable<SalesEvent>代替。这允许您在最后跳过List转换,并且在某些情况下可以实现延迟和/或部分执行等整洁技巧。

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

+0

真棒...感谢您的解决方案和其他提示! – Kbanashek 2011-05-11 23:49:29