如何将参数传递给 FromSqlRaw?

Posted

技术标签:

【中文标题】如何将参数传递给 FromSqlRaw?【英文标题】:How to pass parameters to FromSqlRaw? 【发布时间】:2022-01-06 16:53:47 【问题描述】:
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 的存储过程,它需要两个参数月份和年份。

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

【问题讨论】:

【参考方案1】:

在 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,则字符串插值将在传入查询之前发生,并且不会被参数化。

【讨论】:

以上是关于如何将参数传递给 FromSqlRaw?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 将参数传递给 Button 的操作

如何将多个重复的参数传递给 CUDA 内核

jQuery UI 问题。如何将参数传递给函数

如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?

如何通过 JCL 将参数传递给 REXX 程序

如何将条目参数传递给 Xamarin MVVM 视图模型