1

我有運行從我的ASP.NET MVC6 EF7 web應用程序控制器的查詢一些麻煩......EF7上的Linq不適用於聯接和日期?

模型和的DbContext在此以前問:EF7 Incorrect configuration of the DBContext?

當我嘗試出現問題運行以下Linq查詢包含聯接的一對夫婦,並試圖從特定日期數據庫得到一些條目...

public IActionResult GetEntries(int year, int month, int day) 
{ 
    //_context.Database.SetCommandTimeout(180); 
    string dateTest = new DateTime(year, month, day).ToString("yyyy-MM-dd"); 

    var results = (from c in _context.Comments 
        join r in _context.Reviews on c.ReviewId equals r.ReviewId 
        join f in _context.Films on c.ReviewId equals f.ReviewId 
        where c.Author.Equals("AuthorTest") 
        && (c.Created.CompareTo(new DateTime(year, month, day, 0, 0, 0)) >= 0) && (c.Created.CompareTo(new DateTime(year, month, day, 23, 59, 59)) < 0) 
        && !r.Status.Contains("Enabled") 
        select new 
        { 
         ReviewId = c.ReviewId, 
         ReviewStatus = r.Status, 
         Author = c.Author 
        }); 
    var results2 = results.ToList(); 
    return View(results2); 
} 

,我得到的是一個例外...

類型「System.Data.SqlClient.SqlException」的異常出現在 EntityFramework.Core.dll但在用戶代碼中沒有處理

其他信息:超時過期。在完成操作或服務器沒有響應之前,超時時間已過去 。

有趣的是....如果我沒有運行下面的行完全相同的查詢,然後它完美

&& (c.Created.CompareTo(new DateTime(year, month, day, 0, 0, 0)) >= 0) && (c.Created.CompareTo(new DateTime(year, month, day, 23, 59, 59)) < 0) 

所以......超時異常的事情並沒有什麼太大對我來說很有意義,因爲一旦我刪除AND條件,就會返回數千條記錄。

另外,如果我是插在ASP.NET MVC5 EF6相同的查詢,查詢就像使用AND條件的魅力。

缺少什麼我在這裏?

最後,我想另一件事是建立一個單一的Linq查詢,沒有加入,與日期條件和它的作品也很好......

public IActionResult GetEntries(int year, int month, int day) 
{ 
    //_context.Database.SetCommandTimeout(180); 
    string dateTest = new DateTime(year, month, day).ToString("yyyy-MM-dd"); 

    var results = (from c in _context.Comments 
        where c.Author.Equals("AuthorTest") 
        && (c.Created.CompareTo(new DateTime(year, month, day, 0, 0, 0)) >= 0) && (c.Created.CompareTo(new DateTime(year, month, day, 23, 59, 59)) < 0) 
        select new 
        { 
         ReviewId = c.ReviewId, 
         Author = c.Author 
        }); 
    var results2 = results.ToList(); 
    return View(results2); 
} 

任何指針?

謝謝!

回答

2

我認爲這是因爲您的Linq to Entities提供程序不知道如何將CompareTo方法轉換爲SQL。嘗試創建您想要在您的查詢之外進行比較的日期,然後嘗試在您的查詢中進行比較,如下所示:

var d1=new DateTime(year, month, day, 0, 0, 0); 
var d2=new DateTime(year, month, day, 23, 59, 59); 
var results = (from c in _context.Comments 
       join r in _context.Reviews on c.ReviewId equals r.ReviewId 
       join f in _context.Films on c.ReviewId equals f.ReviewId 
       where c.Author.Equals("AuthorTest") 
       && c.Created >= d1 && c.Created<d2) 
       && !r.Status.Contains("Enabled") 
       select new 
       { 
        ReviewId = c.ReviewId, 
        ReviewStatus = r.Status, 
        Author = c.Author 
       }); 
+0

它工作正常!人......我被這些東西封鎖了,並嘗試了幾件事情,但並不認爲這種解決方案會起作用!非常感謝!欣賞它! – user3587624

+0

不客氣,作爲未來的建議,嘗試使用運算符代替查詢中的方法調用。正如你所看到的,EF支持'Equals'和'Contains',但是有一些支持的方法非常有限。 – octavioccl

+0

知道了!謝謝! – user3587624

相關問題