实体框架核心原始SQL问题

amp*_*ier 0 c# entity-framework-core

我有一张History有栏的桌子C0, C1, C2, C3, TimeStamp

我想根据输入以及相应的选择一个特定的列TimeStamp

channelId是“C2”

var context = new DalModels.DbContext();
string command = "SELECT TimeStamp, @channelId FROM dbo.History";
var user = new SqlParameter("@channelId", channelId);
var result = context.History.FromSql(command, user).ToList();
Run Code Online (Sandbox Code Playgroud)

但是我没有得到结果,而是出现了一个例外:

没有为“ h”的列2指定列名。

无效的列名“ C0”。

无效的列名“ C1”。

无效的列名“ C2”。

无效的列名“ C3”。

无效的列名“ TimeStamp”。

Pri*_*hal 6

参数化查询不能用于动态列名。参数只能在表达式的右侧使用,例如,在=。之后。

要解决您的问题,请将查询转换为使用变量。

var context = new DalModels.DbContext();
string command = $"SELECT TimeStamp, {channelId} FROM dbo.History";
var result = context.History.FromSql(command, user).ToList();
Run Code Online (Sandbox Code Playgroud)

注意$用于字符串插值

然后,您必须将用户可以传递给该字段的值列入白名单,以防止SQL注入攻击。

  • 是的,但这只是故事的一半。FromSql需要选择所有实体列,因此无论如何都不能使用。 (2认同)