2016-08-09 2 views
0

У меня возникла проблема, и я не понимаю ее. Так что у меня есть эта SqlQuerrySqlQuerry ToList() работает, но Linq (Iqueryable) нет?

var blogs = context.Meal.SqlQuery("SELECT * FROM dbo.Meal WHERE PersonID=" + id.ToString() + "AND DATEDIFF(day,GETDATE(),Datetime) <= 7 ").ToList(); 

И это прекрасно работает, но я попытался передать это выражение LINQ, и я не могу получить ToList() для работы

var blogs1 = from c in context.Meal 
      where c.PersonID.Equals(id) 
      where (DateTime.Now.Date - c.Datetime).Days <= 7 
      select c; 
List<Meal> blogs = blogs1.ToList(); 

Я получаю эту ошибку:

An unhandled exception of type 'System.ArgumentException' occurred in EntityFramework.SqlServer.dll

Additional information: DbComparisonExpression requires arguments with comparable types.

Я гугл много, пытался сначала вар блог, а затем попытался с ToList<Meal> пытался DateTime.Now, но я скопировал выражение из сети, а затем из-за отложенное исполнение я написал

var blogs = (from c in context.Meal 
      where c.PersonID.Equals(id) 
      where (DateTime.Now.Date - c.Datetime).Days <= 7 
      select c).ToList(); 

Но нет, он не будет работать:/ Я использую System.Linq, и я прочитал здесь, на StackOverflow, что Linq поддерживает IQueryable ToList. Возможно ли, что мой Linq ошибочен, он выглядит просто, и я получил его из сети, чтобы он не ошибся?

Если вам нужно больше информации в комментариях, я добавлю его. Благодаря!

EDIT1: Изменено. Общее время суток. Как указано в @garethb, но ошибка сохраняется. EDIT2: Я попытался это, как Матиас предложил

var now = DateTime.Now.Date; 
var blogs1 = from c in context.Meal 
      where c.PersonID.Equals(id) 
      where EntityFunctions.DiffDays(now, c.Datetime) <= 7 
      select c; 
List<Meal> blogs = blogs1.ToList(); 

И получил эту ошибку: (то же самое с SqlFunctions)

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll 

Additional information: LINQ to Entities does not recognize the method 'System.Nullable`1[System.Int32] DiffDays(System.Nullable`1[System.DateTime], System.Nullable`1[System.DateTime])' method, and this method cannot be translated into a store expression. 

Для отделки я случайно отмечен этот вопрос как дубликат, но это не так. Я не понял, где проблема, но главная проблема заключается в том, что Microsoft изменила пространство имен метода DiffDays от EntityFunctions до DbContext в EF 6.x, и именно поэтому мой Linq не работал. В этом примере это может быть сравнение дат, но это по-другому, поэтому оно не дублируется.

+0

Допускает ли Meal.Datetime нулевые значения? Думаю, у тебя есть. Кроме того, каково определение «сейчас»? –

+0

@WesleyLong Нет, это не автоматическое сгенерированное добавлением еды, без ввода пользователя. Теперь добавлено определение. Но я решил проблему. Спасибо, в любом случае! – Vulisha

+0

или просто сравнить с 2 датами http://stackoverflow.com/questions/21000287/date-difference-logic-in-linq – Slai

ответ

1

Вы, скорее всего, используете EntityFramework 6+. Это означает, что вам нужно использовать класс DbFunctions. У меня есть несколько проверок, которые я хочу сделать для EF mainline, чтобы исправить эту проблему, но на данный момент используйте этот код.

https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions.diffdays(v=vs.113).aspx

var today = DateTime.Now.Date; 
var blogs1 = from c in context.Meal 
      where c.PersonID.Equals(id) 
      where DbFunctions.DiffDays(today, c.Datetime) <= 7 
      select c; 
List<Meal> blogs = blogs1.ToList(); 
+0

Да, это он ! он работает сейчас, он подсчитывает все данные в настоящее время, но я обойду эту небольшую ошибку, но Linq работает окончательно, большое спасибо Арону! – Vulisha

1
// add to top of file 
using System.Data.Entity; 

// code 
var today = DateTime.Now.Date; 
var blogs1 = from c in context.Meal 
      where c.PersonID == id 
      && DbFunctions.DiffDays(today, c.Datetime) <= 7 
      select c; 
List<Meal> blogs = blogs1.ToList(); 

См DbFunctions, это C# выражения, которые переводят в функции SQL Server.

+0

Пробовал это до EntityFunctions, та же проблема – Vulisha

+0

@Vulisha - вы уверены, что это не 'c. PersonID.Equals (id) '? Это должно быть 'c.PersonID == id'. Примитивные типы не рассматриваются как объекты в выражениях EF, когда они преобразуются в операторы sql. – Igor

+0

О, я этого не видел, я попробую! – Vulisha

Смежные вопросы