2015-09-25 63 views
1

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

第一个测试(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(); 

这里是跟踪:

未知列“Extent1.Id”中“,其中clause'MySql.Data.MySqlClient.MySqlException

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

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

+0

您是否尝试激活EF记录器(Database.Log = Console.Write)来检查会发生什么? –

+0

Jap我记录了失败的SQL查询。但这真的很奇怪。我搜索日志并将其粘贴到此处。 – creality

回答

0

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

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

2)。凡(M => m.Trash == FALSE)< = '已删除' 不是在选择,所以此属性不知道此时

3).OrderByDescending(f => f.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()和。取(),我们得到了很好的 'LEFT OUTER JOIN'

+0

日本证实。只要忽略逗号 - 这是没有道理的,但它在那里没问题。我也认为这是一个在MySQL驱动程序中的错误。感谢您花时间去追捕这个bug。下一步是什么?我尝试联系MySQL的好友并让你知道。 – creality

0

这种查询是一种无法与MySQL做。如果你自己编写查询,你会如何在SQL中编写它?问题是MySQL不支持SQL标准所称的横向连接,在MsSQL中使用关键字“APPLY”。 PostgreSQL和MsSQL的.NET驱动程序支持这些查询,但不支持MySQL。