我有一个包含这两个表的数据库:Customer
和CustomerStatus
。 CustomerStatus
是所谓的只读表。对客户状态的所有更改都会导致对该表进行INSERT。当前客户状态可通过CustomerStatus.StatusTimestamp
找到。
现在,我正在寻找一个LINQ实体查询,该查询可将所有客户及其当前状态一起加载。就像是.Include("CustomerStatus.OrderByDescending(StatusTimestamp).FirstOrDefault()")
。
我还没有找到使用EF 4.0的正确方法。
我当前的解决方法非常难看,并使用2个步骤:
步骤1:LINQ查询加载所有状态(在业务/数据层中):var r = from c in db.Customers.Include("CustomerStatus") select c;
步骤2:从GUI中的每个客户那里获取适当的状态(在MVC3 View 中循环显示):c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp).FirstOrDefault()
知道如何直接在一个步骤中完成吗?
最佳答案
EF比您认为的要强大。它可以做的一件事就是将一个复杂的类型投影到IQueryable
中(即,在一个数据库命中)。这应该工作:
var data =
from c in db.Customers
select new {
Customer = c,
LastStatus = c.CustomerStatus // assuming navigation property set up right
.OrderByDescending(s => s.StatusTimestamp)
.FirstOrDefault()
};
现在
data
是IQueryable<anonymous_type>
,每个项目都有一个给客户的Customer
属性,一个给客户提供最新时间戳状态的LastStatus
,如果没有客户的状态记录,则为null
。您也可以在这里使用命名类型,这样我键入起来就更快了:)。