2012-03-22 9 views
91
TimeSpan time24 = new TimeSpan(24, 0, 0); 
TimeSpan time18 = new TimeSpan(18, 0, 0);  

// first get today's sleeping hours 
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientDateTime - o.ClientDateTimeStamp < time24) && 
      o.ClientDateTimeStamp.TimeOfDay > time18 && 
      clientDateTime.TimeOfDay < time18 && 
      o.UserID == userid).ToList(); 

を持っている必要があります。このLINQの式は、この例外がスローされます。DbArithmeticExpression引数が数値一般的なタイプに

DbArithmeticExpression arguments must have a numeric common type. 

助けてください!

+0

'clientDateTime - o.ClientDateTimeStamp'の結果はどうなりますか? – shahkalpesh

+0

EF例外でTimeSpanのオブジェクトであるはずのnoramllyがスローされます。 –

答えて

189

DateTimeの演算は、Entity Framework 6以前ではサポートされていません。 DbFunctions *を使用する必要があります。だから、あなたの文の最初の部分、のようなもののために:DiffHours方法はNullable<DateTime>を受け入れること

var sleeps = context.Sleeps(o => 
    DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24); 

注意。 (SQL Serverで使用、多分他のDBプロバイダ)

エンティティFramworkコアは(AddHoursなど)のDateTime AddXxxの機能をサポートしています。それらはSQLではDATEADDに翻訳されています。 @GertArnoldにより示唆されるように、私は、これは古い問題であることを知っているが、代わりにDBFunctionsを使用してあなたの特定のケースでは前Entity Frameworkのバージョン6

1

* EntityFunctions、あなただけの操作を反転ことができませんでした問題の算術をラムダから移動する?

結局のところ、clientDateTimetime24は固定値であるため、各繰り返しでその差を再計算する必要はありません。

同様:

TimeSpan time24 = new TimeSpan(24, 0, 0); 
TimeSpan time18 = new TimeSpan(18, 0, 0);  

var clientdtminus24 = clientDateTime - time24; 

// first get today's sleeping hours 
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientdtminus24 < o.ClientDateTimeStamp) && 
      o.ClientDateTimeStamp.TimeOfDay > time18 && 
      clientDateTime.TimeOfDay < time18 && 
      o.UserID == userid).ToList(); 

あなたが他の日時と修正のタイムスタンプによってシフト保存された日時を比較しようとしている場合は、このリファクタリングは通常可能です。

関連する問題