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

Entity framework 如果参数可能为空,则从sql select获取值,entity-framework,entity-framework-core,ado.net,npgsql,executescalar,Entity Framework,Entity Framework Core,Ado.net,Npgsql,Executescalar,在ASP.NET MVC Core应用程序中,正在寻找一种使用EF Core从任意sql查询中获取第一列第一行的值的方法 像 抛出错误 InvalidCastException:值“”不是“NpgsqlParameter”类型 并且不能在此参数集合中使用。 Npgsql.NpgsqlParameterCollection.Cast(对象值) 运行此类查询的最佳方式是什么? 也许EF core有一些内置方法?还是使用某种类型并将其注入EF Context is OnModelCreated方法更好

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

抛出错误

InvalidCastException:值“”不是“NpgsqlParameter”类型 并且不能在此参数集合中使用。 Npgsql.NpgsqlParameterCollection.Cast(对象值)

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

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

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

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

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

   var total = ctx.ExecuteScalar<decimal?>(@"select ... where p1={0}", null);
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);