如何将参数传递给FromSqlRaw?

Boo*_*Man 6 c# sql entity-framework

using(DAD_BaldipContext ctx = new DAD_BaldipContext())
{
    int month = 02;
    int year = 2018;
    var x = ctx.TruckRentalPb.FromSqlRaw("TotalMonthlyRental @month, @year", month, year).ToList();

    textbox.Text = x[1].TruckId.ToString();
}
Run Code Online (Sandbox Code Playgroud)

存储过程:

ALTER PROCEDURE [dbo].[TotalMonthlyRental] 
    @month int, 
    @year int
AS
BEGIN
    SET NOCOUNT ON;

    SELECT MONTH(RentDate) AS Month, SUM(TotalPrice) AS TotalRental
    FROM [TruckRental-PB]
    WHERE MONTH(RentDate) = @month
      AND YEAR(RentDate) = @year
    GROUP BY MONTH([RentDate]), YEAR(RentDate)
END
Run Code Online (Sandbox Code Playgroud)

我试图调用这个存储过程,TotalMonthlyRental它需要两个参数月份和年份。

我已经硬编码了一个月和一年,但是我收到错误必须声明标量变量月份。

Dav*_*oft 8

在 FromSqlRaw 中,您可以构造 DbParameter 对象,

int month = 02;
int year = 2018;
var pMonth = new SqlParameter("@month", System.Data.SqlDbType.Int);
var pYear = new SqlParameter("@year", System.Data.SqlDbType.Int);

pMonth.Value = month;
pYear.Value = year;

var x = ctx.TruckRentalPb.FromSqlRaw("exec TotalMonthlyRental @month, @year;", pMonth, pYear).ToList();
Run Code Online (Sandbox Code Playgroud)

或使用格式样式字符串。

int month = 02;
int year = 2018;
var x = ctx.TruckRentalPb.FromSqlRaw("exec TotalMonthlyRental {0}, {1};", month, year).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,在传递格式字符串和其他参数时没有任何歧义,因此 EF 知道对查询进行参数化。

如果您的查询是插值字符串,您还可以使用FromSqlInterpolated为您处理参数化:

int month = 02;
int year = 2018;
var x = ctx.TruckRentalPb.FromSqlInterpolated($"exec TotalMonthlyRental {month}, {year};").ToList();
Run Code Online (Sandbox Code Playgroud)

如果将该插值字符串传递给 FromSqlRaw,则字符串插值将在传入查询之前发生,并且不会被参数化。