【问题标题】:Linq query FromSql where passing string valueLinq 查询 FromSql 在哪里传递字符串值
【发布时间】:2021-04-20 22:38:26
【问题描述】:

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

使用 EF Core

当我执行时

 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: 'Invalid column name 'Mike'。'

我测试了我是否更改了数据库列中的数据:名称为 123(数字)它可以工作,但当值为字符串时失败

【问题讨论】:

    标签: c# entity-framework linq


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

    2. 检查Name 列是否为VARCHAR。如果列是VARCHAR,则需要使用 ' 符号。如果没有,您可以使用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。你能用我写的代码吗?谢谢。

    【讨论】:

    • 你完全正确!接得好!感谢您的帮助!
    • 不客气。我很高兴我帮助了:)
    • 使用参数,不要将数据连接/插值到查询中
    • @Charlieface 这不是连接或插值,而是硬编码值。
    • @juharr OP 显然在他们的真实代码中使用插值,正如$ 所指出的那样,对这样的搜索值进行硬编码是没有意义的,即使在问题他们已经直接编辑了值
    【解决方案2】:

    您应该使用适当的参数化,不要将数据连接或插入到查询中,否则您将面临注入攻击和语法错误。

    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

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多