实体框架核心原始SQL问题

时间:2019-08-30 14:31:45

标签: 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();

但我没有得到结果,而是出现异常:

  

未为“ h”的第2列指定列名。

     

无效的列名“ C0”。

     

无效的列名“ C1”。

     

无效的列名“ C2”。

     

无效的列名“ C3”。

     

无效的列名“ TimeStamp”。

1 个答案:

答案 0 :(得分:6)

参数化查询不能用于动态列名。参数仅在表达式的右侧使用,例如_regionManager.RequestNavigate(RegionsNames.MainSections, "somethingelse_rootview"); 之后。

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

=

请注意,var context = new DalModels.DbContext(); string command = $"SELECT TimeStamp, {channelId} FROM dbo.History"; var result = context.History.FromSql(command, user).ToList(); 用于string interpolation

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