簡體   English   中英

ASP MVC MsSql到MySQL的遷移

[英]ASP MVC MsSql to MySQL migration

對於預算較低的項目,我必須使用MySql運行IIS Asp Mvc。 遷移現有項目運行良好,但是如果我使用“匯入和跳過”創建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();

第三次測試(失敗)

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

這是跟蹤:

'where子句'MySql.Data.MySqlClient.MySqlException中的未知列'Extent1.Id'

毫無意義。 與MsSql相同的代碼可以正常工作。 使用最新的MySql.Data.Entity.EF6,版本= 6.9.7.0

我想念什么嗎? 花幾個小時解決問題,但沒有成功。

您確定第二個查詢確實可以嗎?

1)Id = d.Id,<=為什么用逗號(不是很重要)? (“ ID =”是多余的)

2).Where(m => m.Trash == false)<='Trash'不在選擇中,因此此屬性目前未知

3).OrderByDescending(f => f.Created)<=等同於'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職位:

“ where子句”中的未知列“ Project2.Name”

它於3年前發布,如果可以告訴您任何信息,則標記為“關鍵”。 它存在於MySQL連接器6.9.11.0及更高版本中。 我只需要盡力而為。 我不希望它能解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM