【问题标题】:Using EntityFramework dbContext to get records with count in another table使用 EntityFramework dbContext 获取另一个表中的计数记录
【发布时间】:2015-11-17 07:54:31
【问题描述】:

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

假设我有 2 张桌子: 客户订购 Customer 和 Order 之间存在一对多的关系。

我想使用 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...
}

【问题讨论】:

    标签: c# dbcontext entity-framework-4.3.1


    【解决方案1】:

    您的 SQL 还包含一个嵌套集合,因此您的 LINQ 将是相同的。类似于.Where(c =&gt; c.Orders.Any(order =&gt; order.OrderDate &gt; someDate));

    【讨论】:

    • 太棒了!非常感谢。正是我需要的第一个,并为我指出了第二个的正确方向。我会将我的最终结果添加到我的 OP 中。
    【解决方案2】:

    int noOfRecords = _dbContext.Customer.Count();

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多