gpt4 book ai didi

entity-framework - 像这样使用 EF 将多个查询聚合为一个查询吗?

转载 作者:行者123 更新时间:2023-12-02 20:01:08 25 4
gpt4 key购买 nike

我在我的应用程序中使用 EF 4.0 POCO。 检索这样的信息有什么缺点吗?

给定一个 customerId 和一个 productId,我想应用一些业务规则,这些规则要求我从需要多次查询的数据库中获取大量微小的信息。相反,我可以编写一个查询,如下所示:

var customerId = 1;
var productId = 1;

var aggregateQuery =
from entry in Customers.Take(0).DefaultIfEmpty()
select new
{
numberOfOrders = SalesOrderHeaders.Where (header => header.CustomerID == customerId).Count(),
canSellProduct = Products.Where(product => product.ProductID == productId && product.SellEndDate > DateTime.Now).Count () > 0

//more infromation of this sort, required to enforce business rules
};

var informationPacket = aggregateQuery.First();

Customers.Take(0).DefaultIfEmpty() 只是提供了一种启动查询的方法,CustomersSalesOrderHeadersProducts 是来自上下文的 EF ObjectQuery 实例(此示例来自 LinqPad)。这会产生以下 SQL:

-- Region Parameters
DECLARE @p0 Int = 1
DECLARE @p1 Int = 1
DECLARE @p2 DateTime = '2012-04-04 21:02:20.798'
DECLARE @p3 Int = 0
-- EndRegion
SELECT TOP (1) [t6].[value] AS [numberOfOrders], [t6].[value2] AS [canSellProduct]
FROM (
SELECT (
SELECT COUNT(*)
FROM [Sales].[SalesOrderHeader] AS [t3]
WHERE [t3].[CustomerID] = @p0
) AS [value],
(CASE
WHEN ((
SELECT COUNT(*)
FROM [Production].[Product] AS [t5]
WHERE ([t5].[ProductID] = @p1) AND ([t5].[SellEndDate] > @p2)
)) > @p3 THEN 1
WHEN NOT (((
SELECT COUNT(*)
FROM [Production].[Product] AS [t5]
WHERE ([t5].[ProductID] = @p1) AND ([t5].[SellEndDate] > @p2)
)) > @p3) THEN 0
ELSE NULL
END) AS [value2]
FROM (
SELECT NULL AS [EMPTY]
) AS [t0]
OUTER APPLY (
SELECT TOP (0) NULL AS [EMPTY]
FROM [Sales].[Customer] AS [t1]
) AS [t2]
) AS [t6]

最佳答案

出于三个原因,我倾向于使用单独的查询:

  • 隔离:单独的查询更加清晰且易于维护:使用一个整体查询时,每项更改都可能会产生许多副作用。将业务规则应用于小的、独立的代码片段会更容易。
  • 效率:您可能最终会编写一个比单独查询效率低得多的查询,因为不可能找到一个好的执行计划,这甚至可能超过更多数据库往返的成本(但这需要进行基准测试)。
  • 锁定:它可能会工作一段时间,直到需求发生变化以致一个大查询不再工作:可能需要不成比例的大量重构。

再加上一点直觉:需要一些技巧(Take(0))通常表明设计很糟糕(或者也许你只是太聪明了,但就我而言,这通常是前者)。

但是,我当然看到了潜在的优势。如前所述,由于数据库往返次数较少,它可能会表现得更好。使用一个 select new 来组成一个数据传输对象而不是将其从单独的位编织在一起是非常舒服的。

所以,这不是一个明确的结论。就我个人而言,我喜欢让事情变得简单,并在性能确实成为问题时处理它。

关于entity-framework - 像这样使用 EF 将多个查询聚合为一个查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com