2015-09-25 137 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。