【问题标题】:Raw query with IN clause when using EF core使用 EF 核心时带有 IN 子句的原始查询
【发布时间】:2018-12-24 17:07:03
【问题描述】:

首先,对不起,因为我的英语不好。 我对使用 EF 核心原始查询的查询有疑问

SELECT * FROM [Iot.Core].[dbo].[LocaleResources] WHERE [Key] IN ({0})

我想将列表字符串作为参数传递

var inClause = new List<string>() { "Apple", "Banana", "Cream"};

但是 DbContext 返回的结果不正确。

dbContext_LocaleResources.FromSql(_querySelectLocaleResourceByKeyAndLanguage, inClause).ToList()

请帮忙!谢谢你

【问题讨论】:

  • 随便context.LocaleResources.Where(x =&gt; inClause.Contains(x.Key));
  • 嗨@juharr,但我需要使用原始查询。这是我的项目的要求。谢谢你
  • 什么是“不正确”?

标签: c# sql entity-framework asp.net-core


【解决方案1】:

替换占位符的 inClause 数据格式错误。我想出了一种通过使用RawSqlString 将 RawSQL 与 IN 子句一起使用的方法。

  List<string> list = new List<string>()
        {
            "Apple",
            "Banana",
            "Cream"
        };
        StringBuilder sb = new StringBuilder();
        list.ForEach((item) =>
        {
            sb.Append("'");
            sb.Append(item);
            sb.Append("'");
            sb.Append(",");
        });
        sb.Remove(sb.Length - 1, 1);//{'Apple','Banana','Cream'}

        RawSqlString raw = new RawSqlString($"select * from Customer where Name in ({sb.ToString()})");
        var result = _context.Customers.FromSql(raw).ToList();

更新:

如果您想将字符串列表传递给IN,它将始终发出警告。

传递给“FromSql”的 SQL 表达式嵌入了不会被参数化的数据。审查潜在的 SQL 注入漏洞

一种解决方法是使用Or 而不是IN

List<string> list = new List<string>()
        {
            "Apple",
            "Banana",
            "Cream"
        };
        StringBuilder sb = new StringBuilder();
        sb.Append("select * from Customer where "); 
        list.ForEach((item) =>
        {
            sb.Append("Name='");
            sb.Append(item);
            sb.Append("' Or ");
        });
        sb.Remove(sb.Length - 4, 4);
        RawSqlString sql= new RawSqlString(sb.ToString());
        var result = _context.Customers.FromSql(sql).ToList();

【讨论】:

  • 感谢@Xing Zou 你的代码为我工作。但我收到一个警告:传递给“FromSql”的 SQL 表达式嵌入了不会被参数化的数据。审查潜在的 SQL 注入漏洞。如何解决?谢谢你
  • 您可以使用string.Join(",", list.Select(x =&gt; $"'{x}'") 来创建逗号分隔的值字符串。
  • @Minh Mit,如果您将字符串列表传递给INclause,我发现即使我尝试此link,它也会始终出现此警告。我在答案中更新了解决方法
猜你喜欢
  • 2020-06-08
  • 2013-07-09
  • 1970-01-01
  • 2021-02-19
  • 2021-06-01
  • 2014-05-02
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
相关资源
最近更新 更多