包含在 EF Core 3.1 中的 FromSqlRaw 和存储过程中

2024-01-06

所以事情是这样的 - 我目前正在使用 EF Core 3.1,假设我有一个实体:

public class Entity
{
    public int Id { get; set; }
    public int AnotherEntityId { get; set; }
    public virtual AnotherEntity AnotherEntity { get; set; }
}

当我访问DbSet<Entity> Entities正常方式,我包括 AnotherEntity,如:

_context.Entities.Include(e => e.AnotherEntity)

这有效。为什么不呢,对吧?然后我去:

_context.Entities.FromSqlRaw("SELECT * FROM Entities").Include(e => e.AnotherEntity)

这也有效。两者都返回与 AnotherEntity 连接的相同对象集合。然后我使用一个包含相同查询的存储过程SELECT * FROM Entities名为 spGetEntities:

_context.Entities.FromSqlRaw("spGetEntities")

你猜怎么了?这也有效。显然,它给了我相同的输出,但没有加入 AnotherEntity。但是,如果我尝试像这样添加包含:

_context.Entities.FromSqlRaw("spGetEntities").Include(e => e.AnotherEntity)

我正进入(状态:

使用不可组合 SQL 调用 FromSqlRaw 或 FromSqlInterpolated 并在其上编写查询。考虑打电话AsEnumerable在 FromSqlRaw 或 FromSqlInterpolated 方法执行之后 客户端的组成。

即使输出_context.Entities.FromSqlRaw("SELECT * FROM Entities") and _context.Entities.FromSqlRaw("spGetEntities")是相同的。

我找不到证据证明我可以或不能使用 EF Core 3.1 做到这一点,但如果有人能给我任何关于这种方法可能性的提示,那就太好了。

另外,如果有另一种方法可以使用存储过程获取连接实体,我可能会接受它作为我的问题的解决方案。


很快,您就无法做到这一点(至少对于 SqlServer 而言)。解释包含在 EF Core 文档中 -原始 SQL 查询 https://learn.microsoft.com/ef/core/querying/raw-sql - 使用 LINQ 进行编写 https://learn.microsoft.com/ef/core/querying/raw-sql#composing-with-linq:

使用 LINQ 进行组合要求原始 SQL 查询可组合,因为 EF Core 会将提供的 SQL 视为子查询。可以以以下形式组成的 SQL 查询SELECT关键词。此外,传递的 SQL 不应包含任何对子查询无效的字符或选项,例如:

  • 尾随分号
  • 在 SQL Server 上,尾随查询级提示(例如,OPTION (HASH JOIN))
  • 在 SQL Server 上,ORDER BY不使用 with 的子句OFFSET 0 OR TOP 100 PERCENT in the SELECT clause

SQL Server 不允许组合存储过程调用,因此任何对此类调用应用其他查询运算符的尝试都将导致无效的 SQL。使用AsEnumerable or AsAsyncEnumerable之后的方法FromSqlRaw or FromSqlInterpolated确保 EF Core 不会尝试组合存储过程的方法。

另外,由于Include / ThenInclude需要 EF CoreIQueryable<>, AsEnumerable / AsAsyncEnumerable等等不是一个选择。您确实需要可组合的 SQL,因此存储过程不是选择。

不过,您可以使用表值函数 (TVF) 或数据库视图来代替存储过程,因为它们是可组合的(select * from TVF(params) or select * from db_view) .

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

包含在 EF Core 3.1 中的 FromSqlRaw 和存储过程中 的相关文章

  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何在.NET Core上直接调用F#编译器?

    UPD 我想直接从 NET Core SDK 调用 F 编译器 即 fsc 我了解 dotnet build co 但当我只需要编译一个简单的问题时 即 fsc file fs 就足够的情况下 我不想涉及它们 我尝试在 NET Core S
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz

随机推荐