2

私は大きな問題を抱えています。LINQ クエリの何が問題なのかわかりません。ジョブを実行する SQL クエリは次のとおりです。

SELECT     TOP (100) PERCENT MIN(DateTime) AS DateTime, ETAG
FROM         dbo.Table
GROUP BY ETAG, LEFT(DateTime, 10)
ORDER BY ETAG

このクエリを実行すると、約 5 万件の結果が得られます。LINQ でも同じことが必要です。これが私が試したものです:

from d in Table
group d by new { d.ETAG, Date = d.DateTime.Value.Year + d.DateTime.Value.Month + d.DateTime.Value.Day } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault()

これを実行すると、実行に数分かかり、約 9k の結果が得られます。何かがおかしいのですが、何が原因かわかりません。これを正しく理解するのを手伝ってください...よろしくお願いします

4

2 に答える 2

1

2つのクエリに基づいて、LINQステートメントのgroup byは、実際の日付ではなく、年、月、日の整数の合計でグループ化するため、根本的に異なります。

代わりに、これを試してください:

from d in Table
group d by new { d.ETAG, Date = date.DateTime.Value.Date } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault()

編集

残念ながら、Entity Frameworkの制限により、上記のクエリは機能しません(LINQ to SQLでは有効ですが)実際、EntityFrameworkを使用したSQLクエリに効率的な並列処理はありません。LINQ式を使用して必要な出力を取得する唯一のオプションは、.ToList()グループ化して変換する前に、すべてのレコードをキャプチャすることです。理想的ではありませんが、機能します。

from d in Table.ToList()
group d by new { d.ETAG, Date = date.DateTime.Value.Date } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault()
于 2012-09-05T18:20:24.040 に答える
0

.NET 4 以降を使用すると、Entity Framework は日付値専用のユーティリティ関数をいくつか提供します。これにより、最初の例のハードルを乗り越え、グループ化する前にすべての行を熱心にロードする必要がなくなります。

from d in Table
group d by new { d.ETAG, Date = EntityFunctions.TruncateTime(d.DateTime) } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault();

編集:

または、フィールドの日付部分だけでグループ化することが目的の場合は、次を試すことができます。

from d in Table
let dt = d.DateTime
group d by new { d.ETAG, y = dt.Year, m = dt.Month, d = dt.Day } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault();

参照: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/cb58ae5f-5db9-4054-92b6-a1bf63764574/

于 2012-09-05T21:59:20.940 に答える