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

本文关键字:一个 to LINQ 何使用 Entities 包含 另一个 | 更新日期: 2023-09-27 18:16:19

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

你知道如何一步到位吗?

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

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()
相关文章: