使用EntityFramework dbContext获取另一张表中记录数量的记录

3
我正在使用EntityFramework 4.3.1和Database first with dbcontext。假设我有两个表:Customer和Order,其中Customer和Order之间存在1对多的关系。我有两个查询,我想使用EntityFramework运行这些查询以获取不同网页的特定信息。
第一个查询是:获取自特定日期以来下订单的所有客户。 因此,该查询的普通SQL可能类似于:
SELECT * FROM Customer WHERE CustomerID IN (
   SELECT CustomerID FROM Order WHERE OrderDate > '01-01-2012'
)

我不知道如何在EntityFramework中实现这个功能。

我从以下代码开始,但是不知道接下来该怎么做。

var customersWithOrdersAfterGivenDate = this._dbContext.Customer
   .Include("Order")
   .Where(c => ??? What do I do here ??? );

我尝试执行(c.Order.OrderDate > someDate),但是这行不通,因为我无法从Order中获取OrderDate属性,因为EntityFramework将Order视为集合。

第二个问题是:获取给定集合或客户的订单总数

此查询的普通SQL可能如下所示:

SELECT CustomerID, COUNT(*)
FROM Order
WHERE CustomerID IN (*someCollectionOfIDs*)
GROUP BY CustomerID

我不知道如何在EntityFramework中实现这个功能。我该如何从订单表中仅获取CustomerID和该客户的记录总数?我无法想象如何进行分组,以便它不会为每个客户返回每个订单记录。

----------------------------------


更新: 在Eli的反馈后,这是我的最终代码。

获取在给定日期之后创建的订单的客户:

var customerIDs = dbContext.Customer
   .Include("Order")
   .Where(c => c.Order.Any(o => o.DateCreated.CompareTo(startDate) > 0))
   .Select(s => new
      {
         c.CustomerID
      })
   .AsEnumerable()
   .Select(cust => cust.CustomerID)
   .ToList<int>();

在给定客户集合中,获取每个客户的订单总数:

List<int> customerIDs = GetCustomerIDsToQuery();

var orderTotals = dbContext.Orders
   .Where(o => customerIDs.Contains(o.CustomerID))
   .GroupBy(o => o.CustomerID)
   .Select(o => new
      {
         CustomerID = o.Key,
         TotalOrders = o.Count()
      })
   .AsEnumerable();

从上面的代码中,我可以遍历集合并从匿名类型中获取值:

foreach(var ot in orderTotals)
{
   var customerID = ot.CustomerID;
   var totalOrders = ot.TotalOrders;
   //Do something with these values...
}
2个回答

3
你的SQL语句中还包含一个嵌套集合,因此你的LINQ代码也将是相同的。大致如下:.Where(c => c.Orders.Any(order => order.OrderDate > someDate));

太好了!非常感谢。第一个问题得到了完美的解决,第二个问题也指明了正确的方向。我会在我的原始帖子中添加最终结果。 - Stoop

1

int noOfRecords = _dbContext.Customer.Count();

这将返回Entity Framework中表中的记录数。


谢谢,https://msdn.microsoft.com/de-de/library/system.data.entity.dbcontext%28v=vs.113%29.aspx 没有遗漏任何一个字。 - Matthis Kohli
通常情况下,它是根据连接两个表的ID进行分组的。 - phil123456

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接