2009-03-10 34 views
64

SQL sorgusuna bir LINQ ile çalışıyorum ve veri sonucunu filtrelemek için 4 isteğe bağlı alana sahip olduğum bir soruna girdim. İsteğe bağlı olarak, bir değer girme veya girme seçeneği vardır. Özellikle, bir değere sahip veya boş bir dize ve bir değer seçilmiş ya da belki yoktu olabilirdi listeleri aşağı birkaç damla olabilir birkaç metin kutuları ... ÖrneğinLINQ to SQL Burada Madde Opsiyonel Kriterleri

:

using (TagsModelDataContext db = new TagsModelDataContext()) 
    { 
     var query = from tags in db.TagsHeaders 
        where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
        && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE 
        && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE 
        select tags; 
     this.Results = query.ToADOTable(rec => new object[] { query }); 
    } 

Şimdi Aşağıdaki alanları/filtreleri eklemem gerekiyor, ancak yalnızca kullanıcı tarafından sağlanıyorsa.

  1. Ürün Numarası - TagsHeaders'a birleştirilebilecek başka bir tablodan gelir.
  2. PO Numarası - TagsHeaders tablosundaki bir alan.
  3. Sipariş Numarası - PO # ye benzer, sadece farklı sütun.
  4. Ürün Durumu - Kullanıcı bunu bir açılır menüden seçtiyse, buradan seçilen değeri uygulamanız gerekir.

Zaten sahip olduğum sorgu harika çalışıyor, ancak işlevi tamamlamak için, bu diğer 4 öğeyi nereye ekleyebilmeniz gerekiyor, yalnızca nasıl olduğunu bilmiyorum!

+1

Kontrol: Burada

public static IQueryable<TSource> WhereIf<TSource>( this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate) { if (condition) return source.Where(predicate); else return source; } 

IEnumerables için aynı uzatma yöntemidir zaten yanıtlanmış olabilir .. [http://stackoverflow.com/questions/11194/conditional-linq-queries](http://stackoverflow.com/questions/11194/conditional-linq-queries) – jlembke

cevap

114

Orijinal sorgu kodlayabiliriz: kısıtlamaları

bir koşulu temel ardından
var query = from tags in db.TagsHeaders 
       where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
       && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE 
       && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE 
       select tags; 

Ve ek ekleyin.

if(condition) 
    query = query.Where(i => i.PONumber == "ABC"); 

Bunu sorgu sözdizimi ile nasıl kodlayacağımı bilmiyorum, ancak bir lambda ile çalışıyorum. Ayrıca ilk sorgu için sorgu sözdizimi ve ikincil filtre için bir lambda ile çalışır.

Ayrıca, deyimlerin koşullu olması için bir süre geri kodladığım bir uzantı yöntemi (aşağı) da ekleyebilirsiniz. (Sorgu sözdizimi ile iyi çalışmıyor mu):

 var query = db.TagsHeaders 
      .Where(tags => tags.CST.Equals(this.SelectedCust.CustCode.ToUpper())) 
      .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE) 
      .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE) 
      .WhereIf(condition1, tags => tags.PONumber == "ABC") 
      .WhereIf(condition2, tags => tags.XYZ > 123); 

uzatma yöntemi: Burada Roscoe, bunu

public static IEnumerable<TSource> WhereIf<TSource>(
    this IEnumerable<TSource> source, bool condition, 
    Func<TSource, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 
+1

+1 Kodu gerçekten temizler ve çok daha iyi iletişim kurar – jlembke

+3

+10 Cevabınız için çok teşekkürler. Sadece neye bakıyordum. Bunu yapmak için zaman ayırdığınız için gerçekten minnettarım. – RSolberg

+0

Sorun yok. Ben böyle şeyleri severim. – andleer

26

Sadece parametrenin varlığı için bir koşullu kontrol kullanmanız yeterlidir. Örneğin:

where (string.IsNullOrEmpty(ProductNumber) || ProductNumber == tags.productNumber) 

ürün numarası ifadesi her durumda doğru dönecektir, ancak girilirse o yalnızca eşleşen zaman gerçek döneceği girilmezse bu şekilde.

+0

+1 That's Güzel.Ben daha önce benzer bir şey düşünmeye çalışıyordum – jlembke

+0

+1 Benim durumumda 'koşullu nerede' için şık bir çözüm bulmaya çalışıyordum. Birden fazla birleşme geçirdim ve birleştirilmiş bir tablodan kayıtları geri getirdim. Bir çekicilik gibi çalıştı! – AidaM