Linq на EF7 не работает с соединениями и датами?

У меня возникли проблемы с выполнением запроса от контроллера в моем веб-приложении ASP.NET MVC6 EF7...

Модель и DbContext находятся в этом предыдущем запросе: EF7 Неправильная конфигурация 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);
}

Любые указатели?

Спасибо!


person user3587624    schedule 09.12.2015    source источник


Ответы (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
               });
person octavioccl    schedule 09.12.2015
comment
Это сработало! Чувак... Меня заблокировали из-за этого, я пробовал несколько вещей, но не думал, что это решение сработает! Большое спасибо! Ценить это! - person user3587624; 09.12.2015
comment
Пожалуйста, в качестве предложения на будущее попробуйте использовать операторы вместо вызовов методов внутри ваших запросов. Как видите, EF поддерживает Equals и Contains, но количество поддерживаемых методов очень ограничено. - person octavioccl; 10.12.2015