如何使用LINQ to Entities包含另一个表中的一个特定行
本文关键字:一个 to LINQ 何使用 Entities 包含 另一个 | 更新日期: 2023-09-27 18:16:19
我有一个包含以下两个表的数据库:Customer
和CustomerStatus
。CustomerStatus
是一个所谓的只读表。对客户状态的所有更改都会导致INSERT到该表中。当前客户状态可通过CustomerStatus.StatusTimestamp
定位。
现在,我正在寻找一个LINQ到实体的查询,该查询将所有客户及其当前状态一起加载。类似的东西
.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()
你知道如何一步到位吗?
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
。
你也可以在这里使用命名类型,只是我用这种方式打字更快:(。
我不确定你的模式是什么样子的,但呢
var query = from c in db.Customers
join CustomerStatus s on c.StatusTimestamp = s.StatusTimestamp
order by s.StatusTimestamp
select c;
类似的东西??
var r = (from c in db.Customers.Include("CustomerStatus")
where c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp)
select c).FirstOrDefault()