【问题标题】:Entity Framework - LINQ selection in POCO generic List property实体框架 - POCO 通用列表属性中的 LINQ 选择
【发布时间】:2011-08-23 17:06:41
【问题描述】:

我在从 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 属性,它只能获取第一条记录(查看代码是有道理的)。我似乎无法弄清楚要填充整个列表。

【问题讨论】:

    标签: linq entity-framework generics collections


    【解决方案1】:

    是否有理由简单地删除最后的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&lt;SalesEvent&gt;。这允许您在最后跳过 List 转换,并且在某些情况下可以实现延迟和/或部分执行等巧妙的技巧。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 2012-04-25
      • 2011-04-19
      • 2020-06-25
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多