Linq 查询 FromSql 其中传递字符串值

时间:2021-04-20 22:38:26

标签: c# entity-framework linq

有一个 SQL 表示例列 Id-Pk-int, Name-varchar(250), ...

使用 EF 核心

当我执行

 var data= (from c in _db.Table.FromSql($"select * from Emp where id=1")
                     select c).FirstOrDefault();

返回成功

但是当我使用 where 子句名称(字符串)执行时

 var data = (from c in _db.Table.FromSql($"select * from Emp where Name=Mike")
                     select c).FirstOrDefault();

我收到一个异常 System.Data.SqlClient.SqlException: '无效的列名 'Mike'。'

我测试了我是否更改了数据库列中的数据:Name to 123 (number) 它有效但当值为字符串时失败

2 个答案:

答案 0 :(得分:1)

  1. 我认为问题的发生是因为您忘记使用 ' 符号。因为异常说没有名为 Mike 的列。正如我从代码中看到的那样,列名应该是“名称”。

  2. 检查 Name 列是否为 VARCHAR。如果列是 VARCHAR,则需要使用 ' 符号。如果没有,您可以使用 like WHERE ID=1

使用那个;

   var data = (from c in _db.Table.FromSql($"select * from Emp where Name='Mike'")
                     select c).FirstOrDefault();

编辑 2:我看到您说的是 Id-int、Name-varchar。你能用我写的代码吗?谢谢。

答案 1 :(得分:0)

您应该使用正确的参数化,不要将数据连接或插入到查询中,否则您将容易受到注入攻击和语法错误的影响。

var data = (from c in _db.Table.FromSql("select * from Emp where Name = @name",
                   new SqlParameter("@name", SqlDbType.VarChar, 50){Value = "Mike"})
                     select c).FirstOrDefault();


var data = (from c in _db.Table.FromSql("select * from Emp where Id = @id",
                   new SqlParameter("@id", SqlDbType.Int){Value = 1})
                     select c).FirstOrDefault();

在较新版本的 EF Core 中,以相同的方式使用 FromSqlRaw

相关问题