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,而不是匿名类型)。