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它需要两个参数月份和年份。
我已经硬编码了一个月和一年,但是我收到错误必须声明标量变量月份。
在 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,则字符串插值将在传入查询之前发生,并且不会被参数化。