Entity Framework - выбор LINQ в свойстве общего списка POCO - PullRequest
0 голосов
/ 12 мая 2011

У меня возникли некоторые проблемы при настройке общего свойства списка объекта POCO из контекста EF. Например, у меня есть очень простой объект, который содержит следующее:

 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 Ответ

2 голосов
/ 12 мая 2011

Есть ли причина, по которой простое удаление FirstOrDefault в конце не является решением здесь? Я чувствую, что могу что-то неправильно понять.

EDIT:

Мне кажется, я вижу, что ты пытаешься сделать. Проблема в том, что вы создаете список в операторе выбора, когда оператор выбора работает только над одной вещью за раз. Это в основном отображение типа ввода на новый тип вывода.

Попробуйте что-то вроде этого:

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 может уменьшить работу, выполняемую всеми следующими утверждениями.

...