【问题标题】:EF Core FromSqlRaw with column variable带有列变量的 EF Core FromSqlRaw
【发布时间】:2022-01-14 13:00:56
【问题描述】:

尝试将列设置为FromRawSql 中的参数。查询总是返回 null,我理解这是因为 SQL 是在设置参数值之前编译的。如何将列名作为参数传递到查询中?

我正在尝试什么:

var param = new SqlParameter[] {
                        new SqlParameter("@col", dataDiscriminator),
                        new SqlParameter("@value", itemDiscValue)
                    };

var thisq = context.Devices.FromSqlRaw("SELECT * FROM Devices WHERE @col = @value", param);                        
var thisDevice = thisq.SingleOrDefault();

将产生 SQL:

DECLARE @col nvarchar(4) = N'Name';
DECLARE @value nvarchar(26) = N'Registration Template';

SELECT * FROM Devices WHERE @prop = @value

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    您不能使用参数作为表名或列名。试试这个

    var param = new SqlParameter[] {
                            new SqlParameter("@value", itemDiscValue)
                        };
    var thisq = context.Devices.FromSqlRaw($"SELECT * from Devices 
    WHERE [{dataDiscriminator}] = @value", param).ToList();                        
     var thisDevice = thisq.SingleOrDefault();
    

    我不知道 dataDiscriminator 数据来自哪里,但总是记得 sql 脚本注入。

    【讨论】:

    • 我了解到FromSqlInterpolated是这种方式传递参数的首选方法。 “FromSqlInterpolated 和 ExecuteSqlInterpolated 方法允许以防止 SQL 注入攻击的方式使用字符串插值语法”-docs.microsoft.com/en-us/ef/core/querying/raw-sql 这可能会更好,因为我的参数可以由客户端设置。
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2021-04-07
    • 2021-10-13
    • 2021-01-30
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多