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

2024-01-03

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

Given a customerId and a 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();

The Customers.Take(0).DefaultIfEmpty()只是提供了一种开始查询的方法Customers, SalesOrderHeaders and Products是来自上下文的 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]

我倾向于使用单独的查询有以下三个原因:

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

像这样使用 EF 将多个查询聚合为一个查询吗? 的相关文章

  • 从数据库加载而不使用代理类?

    在 Entity Framework 4 中 是否可以选择将一些查询加载到 POCO 中而不使用代理类 为了缓存该对象以供将来只读使用 我正在使用存储库 服务模式 我的意思是 var order orderService GetById 1
  • 学习实体框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 实体框架 4 - 在持久性未知上下文中使用 CTP5(代码优先)映射非公共属性

    我知道这个问题已经有了解决方案 例如这个问题 https stackoverflow com questions 3577891 entity framework ctp4 code first mapping protected prop
  • C# 中 LINQ 中的按多列分组

    我有一个类如下 public class ActualClass public string BookName get set public string IssuerName get set public DateTime DateOfI
  • 播种多对多数据

    您好 我正在尝试为我的项目创建一些种子 但我在将多对多关系数据播种到数据库时遇到问题 My database看起来像这样 in 教师技能 教师ID and Skill ID当然是他们的表的外键 My seeder看起来像这样 protect
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 使用 MVC 5 和实体框架的 jQuery 数据表

    我需要一些关于在控制器中放入什么内容的指导 以便我可以对 jQuery 数据表使用服务器端处理 我正在使用 MVC 5 和实体框架 示例位于 http datatablesmvc codeplex com documentation htt
  • 实体框架代码首先保存后不延迟加载

    我的数据库中有一个查找表和一个数据表 我将使用性别和人物作为例子 假设性别表如下所示 Id Code 1 Male 2 Female 人员表如下所示 Id Name GenderId 1 Bob 1 2 Jane 2 我首先在 EF 代码中
  • Entity Framework 6(代码优先)实体版本控制和审计

    我正在考虑将 Entity Framework 6 1 1 与 SQL Server 2008 R2 一起使用 目前 我正在使用代码优先的 EF 功能创建模型和数据库 我的基本用例是创建一个特定实体的所有更改的日志 ID是关键栏 以帮助审核
  • 在c#中映射两个类

    我有两节课 public class foo1 public int id public string image link public string sale price and public class foo2 public int
  • 使用内存中的单元测试 .ToListAsync()

    下面是由于内存数据库集不支持 ToListAsync 而在 ShouldNotThrow 上失败的测试 我没有方便的确切措辞 但你明白了 如果它很重要 我正在尝试模拟实体框架版本提供的数据库集 6 1 3 TestFixture publi
  • 缺少 EF ObjectContext.SaveChanges

    我正在一个新项目中使用实体框架 我从一年前就开始使用 EF 今天 我尝试使用 Visual Studio 2008 SP1 和 2010 生成实体数据模型 它正在生成对象上下文属性和实体集 但尚未生成 SaveChanges 方法 我什至尝
  • LINQ to Entities 区分大小写的比较

    这不是 LINQ to Entities 中区分大小写的比较 Thingies First t gt t Name ThingamaBob 如何使用 LINQ to Entities 实现区分大小写的比较 那是因为你正在使用LINQ 实体最
  • 将自定义导航属性添加到 OData Web API 控制器

    我有一个 OData v3 Web API 项目 它使用实体框架代码优先模型 主要类别是Coupon 它有一个列表 这实际上是子类型 ItemRequirement 和 BasketRequirement 的 2 元素集合 我希望能够说 o
  • 如何解决“指定的包含路径无效”?

    我有一个相当基本的亲子关系设置 最终结果是我希望能够通过 ASP NET MVC WebAPI 以 JSON 形式返回结果表 我正在使用实体框架 5 0 beta 2 我可以用一个简单的例子来演示我遇到的错误 鉴于课程Category an
  • EF6 不从数据库生成外键关联

    PROBLEM 我正在尝试使用数据库优先方法创建 EF6 模型 简单来说 我有2张桌子tblUser and tblMilkMan上有外键关系UserID柱子 但是当我创建一个新的 EDMX 图并添加 2 个表时 我看不到其中的关系 未创建
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • SimpleMemership CreateUserAndAccount 自定义

    我正在尝试添加一个新属性UserProfile我的模型中的类 public class UserProfile Key DatabaseGeneratedAttribute DatabaseGeneratedOption Identity
  • 实体框架、LinqToSQL 和 sql 注入

    完全使用 Linq To SQL 或实体框架的项目是否有可能遭受 SQL 注入 我认为这可能不是因为 ORM 生成的 SQL 应该是免 SQL 注入的 但我不确定 当您按预期使用这些框架时 即直接使用实体 表 那么就不会 所有字符串比较 即
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1

随机推荐

  • JNI-多线程

    我有一个从 C 调用的 Java 函数的 JNI 包装器 我试图从不同的线程调用一些方法 但在尝试获取 JNIEnv 指针的新副本时出现错误 代码我 m 使用如下并在每个方法中调用 JNIEnv GetJniEnvHandle Thread
  • 为什么 WAMP 中的 Apache 2.1.7 不将 PHP 错误记录到 PHP 错误日志中?

    我已经安装了WAMP 并决定在最新版本的WAMP中使用默认的Apache 2 1 7 原因是我的网站所在的主机服务器也使用 2 1 7 之前 我在 WAMP 中使用 Apache 2 2 11 因为我的上一个主机也使用该版本 我现在遇到的问
  • 使用 golang 打印可读变量

    如何以可读的方式打印地图 结构或其他内容 使用 PHP 您可以做到这一点 echo pre print r var echo pre or header content type text plain print r var 使用Gofmt
  • 如何从不同文件夹中的另一个.py调用def

    我有以下结构 utils dir 有generator py 文件 其中有3 个def 我在 inline dir 中有 test py 我正在尝试在 test py 中使用生成器 py 中的 defs inline dir 和 utils
  • 方法产量如何运作?

    在javadoc中有说yield方法 导致当前正在执行的线程对象暂时暂停并允许其他线程执行 凯瑟琳 塞拉 Katherine Sierra 和伯特 贝茨 Bert Bates SCJP 书中说 Yield 应该做的是 使当前正在运行的线程头
  • 标准形式 matplotlib -- 将 e 更改为 \times 10

    在 matplotlib 中 轴有时以标准形式显示 数字由刻度显示 类似 1e 7 的内容由轴显示 有没有办法将其更改为写出的 times 10 7 我不想更改每个刻度上的标签 我希望更改出现在轴底部的 1e 7 文本 最简单的答案 使用乳
  • 如何验证或验证 JWT 签名?

    我正在尝试在 Java 中验证 JWT 令牌 如何验证或验证 JWT 令牌的 JWT 签名 您可以使用 Spring Security 中的 JWT 库 网址为https github com spring projects spring
  • Android 短信发送状态

    我需要在我的 Android 应用程序中实现一个功能来发送短信 我找到了许多与此相关的教程 但无法获得交付状态 失败或正常 以下是我的短信方法 private void sendSmsMessageWithStatus String pho
  • SWT Shell 根据子项调整大小

    我正在研究这个Composite画布上还有其他Composite可以添加和删除 我对整个布局概念的理解仍然很模糊 当孩子被添加到容器中时 考虑到容器有一个GridData它填充了父级 父级不应该也知道子级调整了大小吗 由于外壳 顶部父级 的
  • Google 可视化 API 示例中的“无效 JSON 字符串”

    我大致如下这个例子 http code google com apis chart interactive docs dev gviz api lib html tojsonexample 但一定是在做一些愚蠢的事情 服务器端Django视
  • C# winform 应用程序未获取 Machine.Config 中的 maxTimeout 值

    我一直在开发一个带有 Oracle 10g 数据库的 winform 应用程序 该应用程序正在使用TransactionScope并想修改maxTimeOut指定的值机器配置文件 我的机器配置文件位于以下位置 我为此应用程序使用 net 4
  • 改进 malloc() 算法的下一步是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我自己写的简单malloc 函数 我想创建更快 更高效的变体 我编写的函数使用线性搜索并在内存中顺序连续分配 改进该算法的下一步是什么
  • 如何保存拟合的 R 模型以供以后使用

    很抱歉这个新手问题 如果我适合lm 型号或loess 模型 并将模型保存在文件或数据库中的某个位置 以供第三方以后使用predict 方法 我是否必须保存整个模型对象 由于返回的模型对象包含原始的原始数据 因此返回的对象可能会很大 如果您包
  • 使用 POI 在 Excel 中设置时间

    我正在尝试使用 Java 中的 POI api 创建 Excel 工作表 在该 Excel 工作表中 我想要一个仅包含 TIME 的单元格 通过设置此值 我们可以将单元格包含在该特定列的求和中 就像我们在数字列中所做的那样 为此 我们需要将
  • Java/XSD 解析

    我怀疑是否有这样的事情 但我想问一下 有谁知道Java中是否有一个库可以读取xsd文件并 创建 定义的元素 例如以字符串格式在代码中使用 例如 阅读以下架构
  • 是什么让 Mersenne Twister Tempering 功能可逆?

    众所周知 MT回火功能是可以逆转的 可以在线获取源代码来执行此操作here http b10l com p 24 我试图弄清楚这是如何工作的 以及如何以编程方式解决这个问题和类似的问题 我正在努力解决的是 对有限大小的变量进行移位操作会导致
  • 计算 pandas 数据框中连续正值的有效方法

    我试图计算 pandas 数据框中每列的连续积极事件的数量 这里DSM提供的解决方案 计算Python数组中的连续正值 https stackoverflow com questions 27626542 counting consecut
  • 名为 X 的 EntityManager 没有持久性提供程序

    我正在使用 JPA 开发 JavaSE 应用程序 不幸的是 我得到null致电后 Persistence createEntityManagerFactory PERSISTENCE UNIT NAME 下面你会发现 我的代码片段调用Ent
  • 平移动画后按钮未响应单击事件

    我已经在按钮上执行了翻译动画 一切都按我的预期工作 但唯一的问题是动画之后按钮没有响应单击事件 请纠正我 Button b Button findViewById R id button1 TranslateAnimation slide
  • 像这样使用 EF 将多个查询聚合为一个查询吗?

    我在我的应用程序中使用 EF 4 0 POCO 像这样检索信息有什么缺点吗 Given a customerId and a productId 我想应用一些业务规则 要求我从需要多次查询的数据库中获取大量微小的信息 相反 我可以编写一个查