あなたのカウントは列挙さIQueryable<Event>
れたe
インスタンスです。したがって、一部の操作は SQL に変換できないため、機能しない可能性があります [編集: または無意味な SQL に変換されます]。
Where
句が確実に機能するようにするには、そのAsEnumerable()
前にを追加します。これにより、 が に変換IQueryable<Event>
され、IEnumerable<Event>
この時点で SQL の生成を停止する必要があることが linq プロバイダーに通知されます。
したがって、次のステートメントは正しい結果を提供するはずです。
int c2 = events.AsEnumerable()
.Where(e => e.TimeStamp.DayOfWeek.ToString() == "Tuesday")
.Count();
変換できない実際のコードは、SQL で問題を引き起こしますe.TimeStamp.DayOfWeek.ToString()
。
System.Data.Objects.SqlClient.SqlFunctions
または、 ( doc here ) クラスを使用して、linq プロバイダーが SQL で何をすべきかを示唆することもできます。
編集
@Servy が指摘したように、これは Linq to SQL の質問です。ただし、問題は非常に一般的であるため、回答を残して削除しません。
OPをもう一度見ると、ゲーム全体に別の変数がある可能性があります...遅延読み込み。
foreach ループでは、TimeStamp が遅延ロードされます。count クエリでは、プロバイダーは SQL クエリを構築しようとしますが、この構築中にToString
(問題があることが知られている)処理できず、 とはe.TimeStamp.DayOfWeek.ToString()
異なるものに評価される可能性があり"Tuesday"
ます。
これAsEnumerable()
により、プロバイダーは SQL の生成を強制的に停止するため、e.TimeStamp
再度遅延読み込みが行われます。
何が起こっているのかを正確に把握する唯一の方法は、DB でトレース ツール (SQL Server Profiler など) を使用して、サーバーで実行されたクエリ (複数可) を実際に確認することです。
編集 2
@Sinaestheticの答えに基づいて構築すると、0が返される理由は、クエリがfalseを返すものと比較しようとする"4"
ため"Tuesday"
、正しい結果はfalse
.
実行することでテスト可能
select ((CONVERT(NVarChar,CONVERT(Int,(DATEPART(dw, getdate()) + (@@DATEFIRST) + 6) % 7))))
DBに対して。
ただし、これは、生成する SQL を決定するのはプロバイダー次第であることも示しています。また、どのステートメントをサポートし、どのステートメントをサポートしないかを決定するのは、プロバイダー次第です。
また、SQL 生成プロセスを停止するために を使用AsEnumerable
すると、クエリのセマンティック評価に影響を与える可能性があることも示しています。