6

キャッシュに保持されているデータを取得しようとしています。ただし、「select new FilterSsrsLog」行で例外がスローされます。例外: この関数は、LINQ to Entities からのみ呼び出すことができます

List<ExecutionLog3> reportServerDB = UpdateCache();
        var reportLog = (from r in reportServerDB
                         orderby r.TimeStart descending
                         where ((model.reportName == null ? true : r.ItemPath.Contains(model.reportName)) &&
                          (model.reportFolder == null ? true : r.ItemPath.Contains(model.reportFolder)) &&
                          (r.TimeStart >= startDateTime) &&
                          (r.TimeStart <= endDateTime)
                         )
                   select new FilterSsrsLog
                   {
                       UserName = r.UserName,
                       ReportName = r.ItemPath,
                       ReportFolder = r.ItemPath,
                       Format = r.Format,
                       Parameters = r.Parameters,
                       TimeStart = r.TimeStart,
                       TimeEnd = r.TimeEnd,
                       TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd)
                   });

「select new FilterSsrsLog」コードブロックを削除して「select r」と書くと、機能します。しかし、その列だけが必要なので、この問題を解決するにはどうすればよいですか?

4

1 に答える 1

10

このエラーが発生する理由は、クエリが RDBMS ではなくメモリで実行されるためです。このDiffMilliseconds関数は、Entity Framework プロバイダーが RDBMS 固有の SQL に変換して RDBMS に送信するマーカーです。この関数は、インメモリに適用されたときに結果を計算せず、IQueryable<T>代わりに例外をスローします。

このクエリをメモリ内で実行する場合は、

TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd)

TotalTime = (r.TimeEnd - r.TimeStart).TotalMilliseconds

2 つの日付を減算すると、そのプロパティTimeSpanを取得できる値が生成されます。TotalMilliseconds

于 2013-08-10T20:49:46.047 に答える