C# 如何使用LINQ to实体包含另一个表中的一个特定行

C# 如何使用LINQ to实体包含另一个表中的一个特定行,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我有一个包含这两个表的数据库:Customer和CustomerStatusCustomerStatus是一个所谓的只读表。对客户状态的所有更改都会导致插入到该表中。当前客户状态可通过CustomerStatus.StatusTimestamp定位 现在我正在寻找一个LINQ to entities查询,它将所有客户及其当前状态一起加载。差不多 .Include(“CustomerStatus.OrderByDescending(StatusTimestamp).FirstOrDefault()

我有一个包含这两个表的数据库:
Customer
CustomerStatus
CustomerStatus
是一个所谓的只读表。对客户状态的所有更改都会导致插入到该表中。当前客户状态可通过
CustomerStatus.StatusTimestamp
定位

现在我正在寻找一个LINQ to entities查询,它将所有客户及其当前状态一起加载。差不多

.Include(“CustomerStatus.OrderByDescending(StatusTimestamp).FirstOrDefault()”)

我还没有找到使用EF4.0的正确方法

我当前的解决方案非常难看,使用了两个步骤:

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


var r=来自数据库中的c.Customers.Include(“CustomerStatus”)
选择c;

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


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

你知道如何一步到位吗?

类似的东西

   var r = (from c in db.Customers.Include("CustomerStatus")
            where c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp)
            select c).FirstOrDefault()

我不确定你的模式是什么样子的,但是你的呢

var query = from c in db.Customers 
            join CustomerStatus s on c.StatusTimestamp = s.StatusTimestamp
            order by s.StatusTimestamp
            select c;

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
,每个项目都有一个
Customer
属性提供客户,一个
LastStatus
提供最新的时间戳状态,如果客户没有任何状态记录,则为
null


您也可以在此处使用命名类型,我这样键入会更快:)。

您能解释一下为什么这不有用吗?但这只是伪代码配合。我怎么知道Customers和CustomerStatus类包含什么?别管标识符了,那
where
子句是怎么回事?这就是
where
子句的样子吗?很好用。谢谢事实上,我仍然分3步完成,但现在都在BLL中:1:
var q=…
。2:
var l=q.ToList()
(强制惰性加载状态)。3:
返回l.Select(i=>i.Customer)
(仍然返回IEnumerable,而不是匿名类型)。