2010-03-17 16 views
7

Bir tarihin linq'de boş olup olmadığını ve gelecekteki bir tarihi olup olmadığını kontrol etmeye çalışıyorum.Linq, birden çok koşullu yan tümce ve null onay

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

Yalnızca ilk doğruysa uygulamak için ikinci denetimi kullanmalıyım. Tek bir havuz desenini kullanıyorum ve FindAll bir yan tümceleri kabul etti

HEDEFLERİNİZ? Burada bir çok benzer soru var ama cevabı vermeyin, tahmin edebileceğiniz gibi Linq için çok yeniyim :)

Düzenleme: Şimdi ihtiyacım olan sonuçları elde ediyorum, ancak> koşullu Bazı durumlarda boş değerlerde. Bu kötü bir şey değil mi?

+0

Sadece nerede (q.ExpiredDate> DateTime.Now) olduğunu söyleyemez misiniz? Bu, ExpiredDate'in gelecekteki bir tarih olduğu tüm satırları döndürmelidir. – Richard

cevap

8

Bu işe yaramayacak mı?

QuestionnaireRepo.FindAll(
    q => (q.ExpiredDate == null) || (q.ExpiredDate > DateTime.Now)); 
+0

Aktif girişleri iade ediyorum :) – Andrew

+0

@SocialAddict: İstediğiniz kesin ölçütleri açıklayabilir misiniz? Sorunuz, "bir tarihin boş olmadığını kontrol edin ... ve eğer geçmiş bir tarihi kontrol etmiyorsa, bu benim kodumun tam olarak ne yaptığıyla ilgili" (ve şu ana kadar diğer tüm cevaplarda verilen kod). Ancak, sorunuzdaki örnek kod bunu yapmaz! – LukeH

+0

İyi bir noktaya yeniden yazdım, üzgünüm :) – Andrew

2

bu ise Linq Sql veya Linq To-varlıkları sonra HasValue SQL İfade çevirmek olmaz ve istisna elde edersiniz.

Bunu yapmalı. Bunu yapabileceğini birkaç yolu var

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

, tek güzel yolu bu yüzden bu modeli kullandığınız gibi gözükmüyor Borular ve Filtreler kullanarak, ancak yukarıdaki uygularken nasıl bakıyor olduğunu onun içine girmeyecek, ama buna değer katacak. Bunu yapabileceğini

Borular ile

ve Filtreler kalıbı:

 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); 
     } 

Ve sonra sadece gitmek: QuestionnaireRepo.FindAll().WithExpiryDate().WhereExpiredDateBeforeThanNow().SingleOrDefault();

Ayrıca sadece söyleyebiliriz:

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

Umut bu yardımcı olur ...