ASP MVC MsSql到MySQL的迁移

本文关键字:迁移 MySQL MVC MsSql ASP | 更新日期: 2023-09-27 18:14:46

对于一个低预算的项目,我必须运行IIS Asp Mvc与MySql。迁移现有的项目运行良好,但如果我创建一个LINQ查询与Take &跳过它失败

第一次测试(OK)

var post = _db.Posts.FirstOrDefaultAsync(a => a.id == 1234);

第二次测试(OK)

var post = _db.Posts.Include(a => a.Comments);
var result = await post.Select(a => new TRDPostViewModel
{
  Created = a.Created,
  Body = a.Body,
  Comments = a.Comments.Select(d => new TRDCommentViewModel
  {
     Body = d.Body,
     Id = d.Id,
  }).Where(m => m.Trash == false)
     .OrderByDescending(f => f.Created)
   .ToList(),
}).FirstOrDefaultAsync();

第三次测试(失败)

var result = await post.Select(a => new TRDPostViewModel
{
  Created = a.Created,
  Body = a.Body,
  Comments = a.Comments.Select(d => new TRDCommentViewModel
  {
     Body = d.Body,
     Id = d.Id,
  }).Where(m => m.Trash == false)
     .OrderByDescending(f => f.Created)
     .Skip(33)
     .Take(10)
   .ToList(),
}).FirstOrDefaultAsync();

Trace:

未知列'Extent1。Id' in 'where子句' mysql . data . mysqlclient . mysqlexception '

完全没有意义。相同的代码与MsSql工作良好。使用最新的MySql.Data.Entity。EF6, Version = 6.9.7.0

我错过了什么吗?花了好几个小时想解决却没有成功。

ASP MVC MsSql到MySQL的迁移

你确定你的第二个查询是真的好吗?

1) Id = d.Id, <=为什么要用逗号(不是很重要)?('ID ='是多余的)

2) .Where(m => m.Trash == false) <= 'Trash'不在select中,因此此时不知道该属性

3) . orderbydescent (f => f.Created) <= idem for 'Created'

4) .ToList()后面为什么要加逗号?

我已经简化了您的DDL(这不是一个MWE)与生成的数据。我已经在VS2013中重现了您的问题。

我还直接对数据库测试了LINQPad的查询,我在第三次测试中遇到了同样的问题,可能是驱动程序mysql中的错误:

trdposts.Select(a => new {
    Created = a.Created,
    Body = a.Body,
    Comments = a.Posttrdcomments
                .Select(d => new { Body = d.body, Id = d.Id, d.Created, d.Trash})
                .Where(m => m.Trash == 1)
                .OrderByDescending(f => f.Created)
                .Skip(33)
                .Take(10)
                .ToList()
    })

给出一个更短的SQL查询:

SELECT t1.PostId, t1.body, t1.Id, t1.Created, t1.Trash
FROM trdposts AS t0
    OUTER APPLY (
      SELECT t2.body, t2.Created, t2.Id, t2.PostId, t2.Trash
      FROM trdcomments AS t2
      WHERE ((t2.PostId = t0.Id) AND (t2.Trash = 1))
      ORDER BY t2.Created DESC
  ) AS t1
ORDER BY t1.Created DESC

没有。skip()和。take(),我们得到了很好的'LEFT OUTER JOIN'

这种查询在MySQL中是不可能实现的。如果您自己编写查询,您将如何用SQL编写它?问题是MySQL不支持SQL标准所说的横向连接,在MsSQL中使用关键字"APPLY"。PostgreSQL和MsSQL的。net驱动程序支持这些类型的查询,但MySQL不支持。

这是MySQL EF的一个已知问题,从其他帖子可能是MySQL本身。看到:

https://bugs.mysql.com/bug.php?id=78610

和其他SO post:

未知列'Project2.Name'In 'where clause'

它是3年前发布的,如果这能说明什么的话,它被标记为critical。它存在于MySQL连接器6.9.11.0及更高版本中。我只能尽我所能地解决这个问题。