我在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);
}
任何指针?
谢谢!
答案 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
});