【问题标题】:How to execute raw sql with IN statement using Entity Framework 6如何使用 Entity Framework 6 使用 IN 语句执行原始 sql
【发布时间】:2017-01-03 04:06:28
【问题描述】:

我有一个包含一些 ID 的列表,我想选择 ID 在该列表中的记录。到目前为止我有

var ids = new List<long> {1, 2, 3};  // Actually the list is not hard coded
using(var context = new MyContext())
{
   context.MyModel.Database.SqlQuery("SELECT * FROM dbo.MyModel WHERE Id IN @p0", ids).ToList();
}

但这不起作用,它给了我一个MySql.Data.MySqlClient.MySqlException

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '_binary 'System.Collections.Generic.List`1[System.Int64]' 附近使用的正确语法 ' 在第 1 行

请不要给我一个 LINQ 解决方案。提前致谢。

【问题讨论】:

  • 我想应该是context.MyModel.Database.SqlQuery 我现在正在使用移动设备,我会检查并在可能的时候通知您。
  • @uteist 你是对的。我的错。谢谢。
  • 我只能通过将 lambda 表达式 .Where(x =&gt; ids.Contains(x.Id)) 添加到 DbSqlQuery 来使其工作。
  • 其实我必须使用联合选择和列名别名(AS子句),所以LINQ可能不适合我。
  • 这是一种愚蠢的做法stackoverflow.com/a/337817/2707705

标签: c# mysql sql entity-framework-6


【解决方案1】:

我认为你不能将数组传递给 sql, 这适用于 SqlServer 您可能需要更改为 MySql 的新 MySQLParameter

var inParams = ids.Select((id, i) => new SqlParameter("p"+i, id));

var query = "select * from Employees where Id in (" + string.Join(",", inParams.Select(p => "@" + p.ParameterName)) + ")";

var data = db.Database.SqlQuery<Employee>(query, inParams.Cast<object>().ToArray()).ToList();

您还可以将 LINQ 用于更复杂的查询以及具有 AS、JOIN 和 UNION 的查询

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2021-12-05
    • 2020-11-27
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多