对于低预算项目,我必须使用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
我错过了什么吗?花几个小时解决但没有成功。
答案 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及更高版本中。我必须尽可能地解决它。我不希望它得到修复。