EF7上的Linq无法使用加入和约会吗?

时间:2015-12-09 18:26:04

标签: asp.net entity-framework linq asp.net-core-mvc entity-framework-core

我在ASP.NET MVC6 EF7网络应用程序上从Controller运行查询时遇到了一些麻烦......

模型和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);
}

我得到的例外是......

  

类型&#39; System.Data.SqlClient.SqlException&#39;的异常发生在   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);
}

任何指针?

谢谢!

1 个答案:

答案 0 :(得分: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
               });