7

linq で日付が null かどうかを確認しようとしています。そうでない場合は、将来の日付を確認します。

QuestionnaireRepo.FindAll(q => !q.ExpiredDate.HasValue || q.ExpiredDate >DateTime.Now).OrderByDescending(order => order.CreatedDate);

最初のチェックが true の場合にのみ適用するには、2 番目のチェックが必要です。私は単一のリポジトリ パターンを使用しており、FindAll は where 句を受け入れました

何か案は?ここには同様の質問がたくさんありますが、答えはありません。ご想像のとおり、私はLinqに非常に慣れていません:)

編集:必要な結果が得られましたが、場合によってはnull値の>条件をチェックします。これは悪いことではありませんか?

4

3 に答える 3

8

これはうまくいきませんか?

QuestionnaireRepo.FindAll(
    q => (q.ExpiredDate == null) || (q.ExpiredDate > DateTime.Now));
于 2010-03-17T16:48:17.803 に答える
2

これが Linq-to-Sql または Linq-To-Entities の場合、HasValue は SQL 式に変換されず、例外が発生します。

これでうまくいくはずです。

QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now)
于 2010-03-17T16:49:38.393 に答える
1

これを行うにはいくつかの方法があります。1 つの良い方法はパイプとフィルターを使用することですが、上記の実装方法を見ると、このパターンを使用しているようには見えないため、ここには入りません。しかし、グーグルする価値があります。

Pipes and Filters パターンを使用すると、次のことができます。

        public static IQueryable<YourType> WithExpiryDate(this IQueryable<YourType> allMyTypes)
        {
            return allMyTypes.Where(f => f.ExpiredDate != null);
        }

        public static IQueryable<YourType> WhereExpiredDateBeforeThanNow(this IQueryable<YourType> allMyTypes)
        {
            return allMyTypes.Where(f => f.ExpiredDate <= DateTime.Now);
        }

そして、ただ行きます:QuestionnaireRepo.FindAll().WithExpiryDate().WhereExpiredDateBeforeThanNow().SingleOrDefault();

次のように言うこともできます。

QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now);

お役に立てれば...

于 2010-03-17T16:49:41.020 に答える