2011-05-11 80 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