我有一个包含这两个表的数据库:CustomerCustomerStatusCustomerStatus是所谓的只读表。对客户状态的所有更改都会导致对该表进行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()
    };

现在dataIQueryable<anonymous_type>,每个项目都有一个给客户的Customer属性,一个给客户提供最新时间戳状态的LastStatus,如果没有客户的状态记录,则为null

您也可以在这里使用命名类型,这样我键入起来就更快了:)。

10-06 08:44