2016-08-09 25 views
0

私は問題を抱えており、まったくそれを得ていません。 :私はこのエラーを取得するSqlQuery ToList()は動作しますが、Linq(Iqueryable)は動作しません。

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(); 

を動作するように)だから私はこのSqlQuerry

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

を持っており、それは完璧に動作しますが、私は、LINQにその表現を転送しようとした、と私はToListメソッド(取得することはできません

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

Additional information: DbComparisonExpression requires arguments with comparable types.

私はDateTime.Nowを試してみましたが、私はネットからの発現をコピーして、ために遅延実行の私がこれを書いて、多くのことをGoogleで検索するvarブログで最初に試さ、その後、ToList<Meal>で試してみました

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のを使用しています、と私はLINQのはのIQueryable ToListメソッドをサポートしていることをここにStackOverflowの上お読みください。 私のLinqが間違っていて、それがシンプルに見えて、ネットから得られたので間違ってはいけないのでしょうか?

コメントに他の情報タイプが必要な場合は、追加します。ありがとう!

EDIT1:変更された総日数は、日曜日に@ガレフが示唆していますが、エラーが続く。 (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. 

: 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(); 

を提案し、このエラーを得たように私はこれを試してみました。私はどこに問題があるのか​​分からなかったが、主な問題は、MicrosoftがDiffDaysメソッドの名前空間をEntityFunctionsからEF 6.xのDbContextに変更したことで、Linqが機能しなかったことにある。この例では、日付を比較している可能性がありますが、それは異なる方法で行われるため、重複しません。

+0

Meal.Datetimeは、NULL値を許可していますか?私はあなたがいくつか持っていると思う。また、「今」の定義は何ですか? –

+0

@WesleyLongいいえ、食事を追加することで自動生成されません。ユーザー入力はありません。今のところ定義が追加されています。 しかし、私は問題を解決しました。とにかくありがとう! – Vulisha

+0

または2つの日付と比較するだけです。http://stackoverflow.com/questions/21000287/dest-difference-logic-in-linq – Slai

答えて

1

ほとんどの場合、EntityFramework 6+を使用している可能性があります。つまり、DbFunctionsクラスを使用する必要があります。私はこの問題を解決するためにEFメインラインにいくつかのチェックインをしていますが、今はこのコードを使用しています。

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は最終的に動作します、たくさんのAronに感謝します! – 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を参照してください。これらは、SQL Serverの機能に変換されるC#の式です。

+0

EntityFunctionsの前に同じ問題を試してみました。 – Vulisha

+0

@Vulisha - 確かに 'cではないですか? PersonID.Equals(id) '?これは 'c.PersonID == id'でなければなりません。プリミティブ型は、SQL文に変換されるときにEF式でオブジェクトとして扱われません。 – Igor

+0

ああ、私はそれを見ていない、秒私は今それを試してみましょう! – Vulisha

関連する問題