ASP MVC MsSql到MySQL的迁移

时间:2015-09-25 20:58:22

标签: c# mysql asp.net asp.net-mvc database-migration

对于低预算项目,我必须使用MySql运行IIS Asp Mvc。迁移现有项目运行正常,但如果我使用Take& amp;创建LINQ查询跳过它失败。

首次测试(确定)

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

第二次测试(确定)

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

第三次测试(FAIL)

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' 在' where子句' MySql.Data.MySqlClient.MySqlException

毫无意义。与MsSql相同的代码工作正常。使用最新的MySql.Data.Entity.EF6,Version = 6.9.7.0

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

3 个答案:

答案 0 :(得分:0)

你确定你的第二个查询真的没问题吗?

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

2)。其中(m => m.Trash == false)< =' Trash'不在选择中,所以此属性目前不知道

3).OrderByDescending(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'

答案 1 :(得分:0)

这种查询对MySQL来说是不可能的。如果您自己编写查询,如何在SQL中编写它?问题是MySQL不支持SQL标准所谓的横向连接,在MsSQL中关键字" APPLY"用来。 PostgreSQL和MsSQL的.NET驱动程序支持这种查询,但不支持MySQL。

答案 2 :(得分:0)

它是MySQL EF的一个已知问题,而其他帖子可能是MySQL本身。 参见:

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

和其他SO帖子:

Unknown column 'Project2.Name' in 'where clause'

它是在3年前发布的,如果能告诉你任何事情那么标记为关键。它存在于MySQL连接器6.9.11.0及更高版本中。我必须尽可能地解决它。我不希望它得到修复。