【问题标题】:How to get specific columns from stored procedure return in .NET 6 and EF 6如何从 .NET 6 和 EF 6 中的存储过程返回中获取特定列
【发布时间】:2022-06-14 16:14:18
【问题描述】:

最近我将我的应用程序更新为 .net 6,将实体框架更新为 6.0.5,但我的一些功能崩溃了,这是意料之中的。也就是说,在此之前我使用的是实体框架 3.1.3。在我的应用程序中,我有许多对存储过程的调用,其中大多数返回一个集合,我从中选择所需的列,然后返回结果。在 3.1.3 中我曾经这样做过:

return await _context.SOME_VIEW.FromSqlRaw("EXEC core.ProcName @P", parameter)
       .Select(x => new ClassA()
       {
           P = x.P,
           D = x.D,
           F = x.F,
           T = x.T
       }).ToListAsync();

但是,现在这让我感到震惊

“'FromSqlRaw' 或 'FromSqlInterpolated' 是使用不可组合的 SQL 调用的,并在其上进行了组合查询。考虑在客户端执行组合的方法之后调用 'AsEnumerable'。”

我做了一些研究,发现如果我这样做的话

return await _context.ClassA.FromSqlRaw("EXEC core.ProcName @P", 
parameter).ToListAsync();

然后就可以了。这里担心的是,如果我选择采用这种方法,我将不得不在我的代码中做很多我试图避免的更改。有没有办法保留使用实体框架 6.0.5 调用存储过程的旧方式?

【问题讨论】:

  • 您正在执行错误告诉您执行的操作并将其获取到客户端并在那里进行选择。尝试从原始 SQL 中的 SPRoc 中仅选择特定列,您会看到。一旦你把它放在客户端的内存中,你就可以做任何你想做的事情——但该操作不再在数据库上执行。
  • 这不是更糟糕的方法吗?因为如果我使用 AsEnumerable,我需要将整个有效负载加载到我的应用程序的内存中,然后从那里过滤。所以除了添加 AsEnumerable 之外,我无法像现在这样解决这个问题?
  • 我真的不明白现在 EF 6.0 为你做的事情的失败是什么。之前来自原始世界(无类型)并且无法跟踪实体世界。突然之间,您拥有了一个 DbSet 的权利——它免费为您提供所有 IQueryable 运算符。所以你甚至不需要去 ToListAsync 和其他东西 - 也许你应该考虑更改你的代码以匹配 EF 建议的内容
  • @anthino12 您可以将您的 SProc 包装在 Select Into #tmpTable 中并返回。您可以从那里选择特定的列。

标签: c# .net-core entity-framework-6 .net-6.0


【解决方案1】:

不,没有办法保持旧的调用模式。

EF Core Power Tools 可以自动为您进行映射,也许它可以简化过渡?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多