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
我错过了什么吗?花了好几个小时想解决却没有成功。
你确定你的第二个查询是真的好吗?
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及更高版本中。我只能尽我所能地解决这个问题。