【问题标题】:Linq on EF7 doesnt work with Joins and Dates?EF7 上的 Linq 不适用于联接和日期?
【发布时间】:2016-03-15 04:02:38
【问题描述】:

我在我的 ASP.NET MVC6 EF7 Web 应用程序上从控制器运行查询时遇到了一些问题...

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

任何指针?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我认为这是因为您的 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
                   });
    

    【讨论】:

    • 成功了!伙计……我被这些东西挡住了,并尝试了几件事,但认为该解决方案行不通!非常感谢!欣赏!
    • 不客气,作为对未来的建议,请尝试在查询中使用运算符而不是方法调用。如您所见,EF 支持EqualsContains,但支持的方法非常有限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多