繁体   English   中英

使用EntityFramework dbContext在另一个表中获取带有count的记录

[英]Using EntityFramework dbContext to get records with count in another table

我首先使用EntityFramework 4.3.1和数据库与dbcontext。

假设我有2个表: 客户订单 ,客户和订单之间有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中执行此操作。 如何从Order表中仅获取CustomerID和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...
}

您的SQL还包含嵌套集合,因此您的LINQ将是相同的。 什么沿着.Where(c => c.Orders.Any(order => order.OrderDate > someDate));

int noOfRecords = _dbContext.Customer.Count();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM