我在从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属性,它只抓取第一条记录(这看起来很合理)。我似乎无法想出填充整个列表。
答案 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
可以减少以下所有声明所执行的工作。