草庐IT

关于 c#:在 EF Core 中执行存储过程,从 JOIN 返回 int。 blazor(客户端)

codeneng 2023-03-28 原文

Execute stored procedure in EF Core returning int from JOIN. blazor(client-side)

如何在 EF Core 中获取从 SQL Server 中的存储过程返回的 int 值?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--Two tables, Employee and AspNetUsers--
CREATE PROCEDURE SP_GetIdEmployeeByUserName
     (@username varchar(100), @idemployee int output)
AS
BEGIN
    SELECT @idemployee = (SELECT e.Id
                          FROM Employee e
                          JOIN AspNetUsers a ON e.IdUser = a.Id
                          WHERE a.Email = @username)

END

--Executing in database--
DECLARE @idemp INT;
EXEC SP_GetIdEmployeeByUserName 'someinsertedemail@gmail.com', @idemp output
SELECT @idemp;

在 SQL Server 测试中返回正确的 Employee.Id

1
idemp `Id = 40`

现在在 Blazor(客户端)控制器中,我正在尝试执行存储过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[HttpGet]
[Route("getbyname")]
public int GetByName([FromQuery] string username)
{
        try
        {
            if (!string.IsNullOrEmpty(username))
            {
                SqlParameter paramUsername = new SqlParameter("@username", username);

                var paramOut = new SqlParameter
                {
                    ParameterName ="@idemp",
                    SqlDbType = System.Data.SqlDbType.Int,
                    Direction = System.Data.ParameterDirection.Output,
                };

                var result = _context
                    .Employee.FromSqlRaw
                    ($"EXEC SP_GetIdFuncByUserName @username, @idemp OUTPUT", paramUsername, paramOut)
                    .FirstOrDefault();

                Console.WriteLine("result = >>>>>>>>>" + result);

                return result.Id;
            }
            else
            {
                return 0;
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine("ex ->" + ex);
            throw;
        }
    }

我得到了这个例外:

FromSqlRaw or FromSqlInterpolated was called with non-composable SQL and with a query composing over it.
Consider calling AsEnumerable after the FromSqlRaw or FromSqlInterpolated method to perform the composition on the client side.

如果尝试

1
2
3
var result = _context
                .Database.ExecuteSqlRaw
                ($"EXEC SP_GetIdFuncByUserName @username, @idemp OUTPUT", paramUsername, paramOut);

它总是返回-1,因为没有行受到影响。

我看到了很多东西,但没有成功...在此先感谢

1
_context.Database.ExecuteSqlCommand if obsolete
  • https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/break-changes#linq-queries-are-no-longer-evaluated-on-the-客户
  • https://github.com/dotnet/efcore/issues/17558
  • 在 EF Core 3.1 中包含 FromSqlRaw 和存储过程
  • 如何通过 FromSqlRaw 在 EF Core 3.0 中调用存储过程
  • EF core 3.1 无法运行复杂的原始 sql 查询
  • https://www.sqlservertutorial.net/sql-server-stored-procedures/stored-procedure-output-parameters/

  • 你试过'FromSqlRaw吗?
  • 旁注:您不应该为您的存储过程使用 sp_ 前缀。 Microsoft 已保留该前缀供自己使用(请参阅命名存储过程),并且您确实会在未来某个时候冒着名称冲突的风险。这对您的存储过程性能也不利。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本没有前缀!


您有不可组合的 SQL。关键是实体框架会写类似

1
2
3
4
SELECT [Generated Column Names] FROM
(
    @YOURQUERY
)

它这样做是为了确定能够实现(嵌套)结果、分页等的格式。

如果你没有从你的存储过程中选择任何东西,它就不能组成这个查询。它无论如何都不会返回结果集,因此您也无法从 dbContext.Employee 中进行选择。那将是两个不同的查询。一个获取您已经拥有的 ID:

1
2
3
var result = _context
            .Database.ExecuteSqlRaw
            ($"EXEC SP_GetIdFuncByUserName @username, @count OUTPUT", paramUsername, paramOut);

这确实返回 -1,因为您的查询中有错误。您提供了一个名为 @count 的参数,但提供了一个名为 @idemp.

的已配置参数

所以请确保你正确地传递参数:

1
2
3
var result = _context
                .Database.ExecuteSqlRaw
                ($"EXEC SP_GetIdFuncByUserName @username, @idemp OUTPUT", paramUsername, paramOut);

然后使用ID参数查询:

1
2
var employeeId = paramOut.Value;
var employee = _context.Employee.FirstOrDefault(e => e.Id == employeeId);

  • 你说的对。 @count 只是复制/粘贴错误。参数输出值;救救我。

有关关于 c#:在 EF Core 中执行存储过程,从 JOIN 返回 int。 blazor(客户端)的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  5. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  9. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐