使用 EF Core 时带有 IN 子句的原始查询

3

首先,很抱歉我的英语不好。 我使用EF Core原始查询时遇到了问题。

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()

请帮忙! 谢谢你

1
只需执行 context.LocaleResources.Where(x => inClause.Contains(x.Key)); - juharr
嗨@juharr,但我需要使用原始查询。这是我的项目要求。谢谢你。 - Minh Mít
什么是“不正确的”? - Gert Arnold
1个回答

1
您的inClause数据格式不正确,无法替换占位符。我找到了一种使用RawSqlString和IN Clause的方法。
  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 注入漏洞。如何解决?谢谢。 - Minh Mít
1
你可以使用 string.Join(",", list.Select(x => $"'{x}'") 来创建逗号分隔的值字符串。 - juharr
1
@Minh Mit,我发现即使我尝试使用此链接将字符串列表传递给IN子句,它仍然会出现此警告。我在我的答案中更新了一种解决方法。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接