Entity framework 如果参数可能为空,则从sql select获取值
在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)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方法更好
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);