Followindは、EF 4.2およびLINQを使用して実行している問題について説明しています。私はこれを複数のシステムで試してみましたが、64ビットと32の両方のバイナリで、SQL(SQL ExpressとSQL 2008 R2 Sp1)、VS 2010 ProとPremiumの複数のフレーバーをデバッガを使って試し、バイナリを直接実行しようとしました。私は、EFの問題、またはコードの問題の可能性が高い場合は、LINQまたはEFに関連するニュアンスを見逃しています。どんな援助も大いに感謝され、6時間それがあった、私のGoogle JuJuは私が恐れているほど強くない。LINQ Entity Framework 4.2 datetimeの比較に失敗しました
私はID(Guid)、名前(String)、タイムスタンプ(DateTime)から成るsessionという簡単なモデルを持っています。私はdbcontextにセッションを追加することができ、セッションレコードが実際にデータベースに格納されていることをデバッグで確認しました。セッションオブジェクトの作成に使用されたタイムスタンプはローカル変数に格納され、格納直後にセッションオブジェクトの新しいインスタンスにセッションを取得しようとします。セッション(LINQ)を取得するコードは、次のスタックトレースで「System.InvalidOperationExceptionが 『シーケンスに要素が含まれていない』」スロー:
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__0[TResult](IEnumerable`1 sequence)
at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.First[TSource](IQueryable`1 source)
at efwtf.Program.Main(String[] args) in d:\vs2010\efwtf\efwtf\Program.cs:line 19
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
私は結果セットにデバッガでctx.Sessionsにドリルダウンして見ることができています実際に取得しようとしているセッションが存在することを確認し、結果セットを繰り返して、2つのタイムスタンプを手動で比較すると、期待通りにセッションを抽出できます。以前の実行でデータベースに追加されたレコードのコードを実行してタイムスタンプ値を渡すと、そのレコードは機能します。私は恐らく最悪の場合、データ型を文字列に変更することで回避することができますが、これはうまくいきません。問題の一部である可能性があり、機能がサポートされるはずです。コードが続きます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
namespace efwtf
{
class Program
{
static void Main (string[] args)
{
Context ctx = new Context();
DateTime ts = DateTime.UtcNow;
Session s1 = new Session() { Id = Guid.NewGuid(), Name = "Testing", TimeStamp = ts };
ctx.Sessions.Add (s1);
ctx.SaveChanges();
Session s2 = (from s in ctx.Sessions
where (s.Name == "Testing" && s.TimeStamp.Equals (ts))
select s).First();
Console.WriteLine (s2.Name, s2.TimeStamp);
}
}
class Context : DbContext
{
public DbSet<Session> Sessions { get; set; }
}
class Session
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
public DateTime TimeStamp { get; set; }
}
}
私はs.datetime.equals(TS)を含むLINQステートメントのバリエーション、およびdatetime.compare(s.datetime、TS)== 0を試みたが、すべての時間が、それは同じ例外がスローされます。
誰もが考えている?私ですか?このコードは私のバイナリを大きく見せますか? = ^)
ありがとうございます。
なぜ、あなたはs.TimeStamp == tsを試していないのですか? – 000
申し訳ありませんが、具体的な例は言及していませんが、これはもともとコード化したものですが、同じ結果です。 – Grogh
また、ストレートラムダアプローチ 'Session s2 = ctx.Sessions.First(s => s。タイムスタンプ== ts); – Grogh