如何使用LINQ to Entities从另一个表中包含一个特定行

mkv*_*kva 5 .net c# linq entity-framework

我有一个包含这两个表的数据库:CustomerCustomerStatus.CustomerStatus是一个所谓的只读表.对客户状态的所有更改都会导致INSERT进入该表.当前客户状态可通过以下位置找到CustomerStatus.StatusTimestamp.

现在我正在寻找一个LINQ to实体查询,它将所有Customers加载到它们的当前状态.就像是

.Include("CustomerStatus.OrderByDescending(StatusTimestamp).FirstOrDefault()").

我没有找到适合EF 4.0的方法.

我目前的解决方法非常难看并使用两个步骤:

步骤1:加载所有状态的LINQ查询(在业务/数据层中):

var r = from c in db.Customers.Include("CustomerStatus") select c;

步骤2:从GUI中的每个客户获取合适的状态(在MVC3视图的循环中):

c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp).FirstOrDefault()

知道如何直接一步完成这项工作吗?

Aak*_*shM 2

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()
    };
Run Code Online (Sandbox Code Playgroud)

Nowdata是一个IQueryable<anonymous_type>,每个项目都有一个Customer为客户提供的属性,以及一个LastStatus提供最新时间戳状态的属性,或者null是否没有客户的任何状态记录。

您也可以在这里使用命名类型,这样对我来说输入速度更快:)。