如果参数可能为空,则从 sql select 获取值

Get value from sql select if parameter may be null

正在使用 EF Core 从 ASP.NET MVC Core 应用程序中的任意 sql 查询中寻找获取第一列第一行值的方法。

喜欢

   var total = ctx.ExecuteScalar<decimal?>(@"select ... where p1={0}", null);

尝试 https://github.com/weitzhandler code from https://github.com/dotnet/EntityFramework.Docs/issues/969 使用 Npgsql EF 提供程序(更改为同步):

public partial class EevaContext : DbContext
{   
    public T ExecuteScalar<T>(string rawSql, params object[] parameters)
    {  
        var context = this;
        var conn = context.Database.GetDbConnection();
        using var command = conn.CreateCommand();
        command.CommandText = rawSql;
        if (parameters != null)
            foreach (var p in parameters)
                command.Parameters.Add(p ?? DbNull.Value);
        conn.Open();
        return (T)command.ExecuteScalar();
    }

如果参数值为空行

command.Parameters.Add(p ?? DbNull.Value);

抛出错误

InvalidCastException: The value "" is not of type "NpgsqlParameter" and cannot be used in this parameter collection. Npgsql.NpgsqlParameterCollection.Cast(object value)

运行 此类查询的最佳方式是什么? 也许 EF 核心有一些内置方法?还是使用某种类型并将其注入 EF Context 是 OnModelCreated 方法更好?

如果没有更好的方法如何修复此代码以便也接受具有空值的参数?

在应用程序中有很多这样的查询,其中包含很多参数,并且在大量工作中重新编写所有这些参数。 WebMatrix QueryValue 在 .NET 4 中使用,它允许在参数中使用空值。

command.Parameters.Add(p ?? DbNull.Value);

p 是 NpgsqlParameter,还是您想发送的某个值??您不能简单地将值(或空值)添加到 command.Parameters.Add - 您需要使用 NpgsqlParameter 包装这些值或改用 command.Parameters.AddWithValue() 。请注意,NpgsqlParameter 还需要正确设置其 ParameterName,对应于原始 SQL 中的占位符(例如 @param1)。