我首先使用EntityFramework 4.3.1和数据库使用dbcontext。
假设我有两张桌子: 客户 和 的订单 客户与订单之间存在一对多的关系。
我想使用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...
}
答案 0 :(得分:3)
您的SQL还包含嵌套集合,因此您的LINQ将是相同的。类似.Where(c => c.Orders.Any(order => order.OrderDate > someDate));
答案 1 :(得分:1)
int noOfRecords = _dbContext.Customer.Count();
这将返回实体框架中表中的记录数。