2012-02-09 16 views
1

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を試みたが、すべての時間が、それは同じ例外がスローされます。

誰もが考えている?私ですか?このコードは私のバイナリを大きく見せますか? = ^)

ありがとうございます。

+1

なぜ、あなたはs.TimeStamp == tsを試していないのですか? – 000

+0

申し訳ありませんが、具体的な例は言及していませんが、これはもともとコード化したものですが、同じ結果です。 – Grogh

+0

また、ストレートラムダアプローチ 'Session s2 = ctx.Sessions.First(s => s。タイムスタンプ== ts); – Grogh

答えて

1

以下のコードを確認してください。しかし、それが動作する方法は論理的ではありません。 note1とnote2の値を見ると、日付の値は正しく保存されますが、そのままクエリには適用されないことがわかります。

var date = new DateTime(ts.Year, ts.Month, ts.Day, ts.Hour, ts.Minute, ts.Second, ts.Millisecond); 
Session s2 = (from s in ctx.Sessions 
      where (s.Name == "Testing" && s.TimeStamp == date) 
      select s).First(); 

var note1 = s2.TimeStamp == date; 
var note2 = s2.TimeStamp == ts; 

私は、これはEntity Frameworkのは、LINQ _0パラメータを@p_する値を割り当てる方法に関連するいくつかのエラーだと思います。これはトレースされたクエリですが、@p_ linq _0に割り当てられている値が見つかりませんでした。

SELECT TOP (1) 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[TimeStamp] AS [TimeStamp] 
FROM [dbo].[Sessions] AS [Extent1] 
WHERE (N'Testing' = [Extent1].[Name]) AND ([Extent1].[TimeStamp] = @p__linq__0) 
+0

私はそれに応じて自分のコードを変更し、それを実行し、正常に動作します。それをもう一度実行して、例外に戻ってください。テーブル内のすべてのレコードを削除し、再度実行しましたが、それでも例外です。いいえ。それは断続的である理由を必ずしも分かりません。多分EFの問題は? – Grogh

+0

価値のあるものについて セッションs2 =(ctx.Sessions内のsから)select s).First(); var test1 =(sess.TimeStamp == pTimeStamp); test1がtrueに評価されます。 #ScratchingHead – Grogh

1

次のようにタイムスタンプがデータベースにDATETIME2データ型であるために、これは仕事を得るために、私はのDataColumn修飾。

class Session 
{ 
    [Key] 
    public Guid Id { get; set; } 
    public string Name { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime TimeStamp { get; set; } 
} 

最終的に誰がこのに実行される問題は、何らかの方法でLINQであるように見えることを考えると、しかし、それはハードルを乗り越えるために私を助け、私はケースにここに投稿だろうと思った、これは周りの仕事であることを考えます。

関連する問題