Entity Framework - 使用参数列表的SqlQuery

5
我尝试使用EF查询数据库中的IN子句: ```html

我尝试使用EF查询数据库中的IN子句:

```
List<int> ids = new List<int> {1,2,3,4....20};
string sql = GetSql(ids);
//sql is "SELECT * FROM Student WHERE Id in (@p0, @p1, @p2 ... @p19)"
var res = db.Set<Student>().SqlQuery(sql, ids);

但我收到了以下异常信息: 没有将对象类型 System.Collections.Generic.List`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 映射到已知的托管提供程序本机类型。

这可能不是问题所在,但我强烈感觉 SQL 查询正在使用字面对象作为参数,而不是对象内部的内容。如果您不介意,请发布您的 GetSql 方法和此处进行的任何其他自定义方法调用。 - DotNet NF
2
我同意,这不是一个重复的问题。我使用参数找到的解决方案是通过构建一个SqlParameter数组:SqlParameter[] parameters。它必须是一个数组。使用列表会产生与上面相同的错误。代码:SqlParameter [] parameters = ids.Select((r,i) => new SqlParameter($"@ManualRead{i}", SqlDbType.Int) { Value = r }).ToArray(); string parameterNames = string.Join(",", parameters.Select(x => x.ParameterName)); --- " where Id IN ({parameterNames})"; --- Context.Database.SqlQuery(cmd, parameters); - Augusto Barreto
1个回答

2
我会像这样处理in语句:

我正在处理类似于以下内容的in语句:

  List<int> ids = new List<int> {1,2,3};
   db.Set<Student>().Where(r => ids.Contains(r.ID));

更新:

按照以下步骤操作(我自己没有测试过,但应该能够完成您的工作):

 public List<CustomObject> ExecuteCustomQuery(List<int> items)
 {
        var ids = string.Join(",", items.Select(i => i.ToString()).ToArray());
       string query = "SELECT Column1, Column1 FROM TABLE1 where id in (" + ids + ")";
       return dbContext.Database.SqlQuery<CustomObject>(query).ToList();


}

CustomObject有两个返回select语句列的属性。

告诉我你进展如何。

谢谢。


3
在我在 Stack Overflow 上看到的几个问题中,有人表示这可能不是很高效。 - Yaron Levi
10
现在我容易受到 SQL 注入攻击,我希望使用参数来避免。 - Yaron Levi
5
您从一个整数列表中不会受到 SQL 注入攻击。 - Chalky
2
string.Join() 可以直接使用 ienumerable<int>,无需先转换为字符串。 - Chalky
2
在Sql Server中,这种方法很容易破坏你的查询缓存。参数始终是更好的选择。 - cbp
显示剩余5条评论

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