如何向FromSqlRaw传递参数?

4
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();
}

存储过程:

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

我想调用名为 TotalMonthlyRental 的存储过程,它需要两个参数:月份和年份。

虽然我已经硬编码了一个月份和年份,但是我却收到了“必须声明标量变量 month”的错误提示。

2个回答

7

在 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();

或使用格式化字符串。

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

注意,当您传递格式化字符串和其他参数时,EF知道应该将查询参数化,因此不存在歧义。

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

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

如果您将该内插字符串传递给FromSqlRaw,那么字符串内的插值操作会在查询传入之前发生,并且不会被参数化。

var x = ctx.TruckRentalPb.FromSqlRaw("exec TotalMonthlyRental @month, @year;", pMonth, pYear).ToList(); 在这种情况下,请确保参数按正确顺序放置。 尽管第一个SqlParameter参数是(@month,@year),但在fromSqlRow中交换月份和年份是行不通的。我的意思是: - Denis Anisimov
变量x = ctx.TruckRentalPb.FromSqlRaw("exec TotalMonthlyRental @month, @year;", pYear, pMonth).ToList(); - Denis Anisimov
我不明白你在问什么。也许如果你有问题,应该提一个新的问题。 - David Browne - Microsoft

1

你的语句中不需要使用exec。可以使用以下代码:

int month = 02;
int year = 2018;

var x = ctx.TruckRentalPb.FromSqlInterpolated($"TotalMonthlyRental {month}, {year}").AsNoTracking().ToList();

此外,对于从数据库中读取数据时使用 AsNoTracking() 可以提高性能约30%。请查看 c-sharpcorner 的博客文章获取更多信息。

另外一个注意点:确保你的变量与存储过程中的顺序完全一致。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接