2017-04-18 4 views
0

私は、EndDateという名前のDateTime?列を持つテーブルを持つsql-server-ce 4データベースを持っています。レコードを削除すると、この終了日を設定します。レコードのリストを取得する場合は、終了日にフィルタを適用して、削除されたレコードをすべてフィルタリングします。linqのDateTimeとSQL Server CEを比較する最も簡単な方法は何ですか?

このフィルターは、エンティティフレームワークを使用してlinq経由で適用します。

私のLINQクエリは次のようになります。私はこのLINQクエリを実行すると、私は次のエラーを取得する

protected IDbSet<TEntity> Entities; 
... 
Entities.AsNoTracking().AsQueryable() 
    .Where(entity => !entity.EndDate.HasValue || entity.EndDate.Value > DateTime.UtcNow); 

The function 'CurrentUtcDateTime' is not supported by SQL Server Compact.

は、このエラーに検索するには、私はそれを理解している場合(と私に伝えます正しく)私はDateTime.UtcNowを使用することはできません。

私の質問は、私が到達しようとしている目標に達するための代替方法は何ですか?

linq経由で使用できる別の機能はありますか?または、私はdatetimeをEpochに変換して比較するより原始的なソリューションを使用する必要がありますか?

+1

あなたは 'var now = DateTime.UtcNow;'と '... entity.EndDate.Value>を試しましたか? – Igor

+0

entity.EndDate.Value.ComparetTo(otherDate)lookup CompareTo – kblau

+0

イワール、ありがとう、トリックでした。私はそれを試みたと思ったが、私はしなかったと思う。私はまだvarが受け入れられ、プロパティはなぜではないのだろうか?何か案は? – Cornelis

答えて

0

問題は、それがまだ実行され、プロセスが使用できる具体的なデータになされていないことを意味IQueryable状態であるため、コードサンプル操作操作に対してローカルではないということです。これにより、必要に応じて別のWhere節などの他の操作によってクエリを調整することができます。

データが実際に照会されると、LinqはSQLを作成してそのジョブを実行し、データベースに送信され、SQLはUTC.Nowを判別できません。 ToListは、実行時にavailbleでデータを作成経由で動作します

Entities.AsNoTracking().ToList() 
         .Where(entity => !entity.EndDate.HasValue 
              || entity.EndDate.Value > DateTime.UtcNow); 

一つのクライアント・オプションは、それをダウンさせた後、そのようにフィルタリングすることで、データのコンクリートを作ることです。もちろん、コストはクライアントでフィルタリングするためにすべての値をダウンさせることです。それが小さければ、何千ものレコードであればいいです。アドバイスされていません。


そうでない場合は、データベース・オプションが必要なレコードをダウンさせる、または必要なテスト(S)のためのブールを返す計算列フィールドを追加するストアドプロシージャを作成することです。

関連する問題