SORU
10 Mart 2009, Salı


SERİ İsteğe bağlı Kriterleri Where SQL

SQL sorgu ve 4 isteğe bağlı alanlar verileri filtre neden ben bir sorun haline çalıştırmak için bir SERİ ile çalışıyorum. İsteğe bağlı olarak, bir değer girmek için seçim var. Özellikle, bir değeri olabilir veya boş bir dize ve bir kaç damla kalmış birkaç metin kutuları bir değer seçilmiş olabilir ya da belki de değil... listeler

Örneğin:

    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 kullanıcı tarafından sağlanan ise/filtreler, ama eklemek istiyorum.

  1. Ürün Numarası - TagsHeaders katılmış olabilir başka bir tablodan Geliyor.
  2. PO Numarası - TagsHeaders tablo içinde bir alan.
  3. Sipariş Numarası - PO Benzer # sadece farklı bir sütun.
  4. Eğer kullanıcı bir açılan bu seçili İse, Ürün Durumu, seçilen değeri buradan başvurabilirler.

Ben zaten sorgu harika çalışıyor, ama, fıkra, ne kadar bilmem nerede bu 4 diğer öğeler ekleyebilmek için işlev ihtiyacı tamamlamak için!

CEVAP
10 Mart 2009, Salı


Özgün sorgu kod:

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 sonra bir koşula bağlı, kısıtlamalar ek ekleyin.

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

Sorgu sözdizimi ile bu kodu nasıl emin değilim ama kimlik lambda ile çalışır. Ayrıca ilk sorgu için sorgu sözdizimi ve ikincil filtre için bir lambda ile çalışır.

Ayrıca bir süre önce koşullu ifadeleri nerede bulunur kodlu bir uzantı yöntemi (aşağıda) ekleyebilirsiniz. (İyi sorgu sözdizimi ile çalışmıyor):

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

Uzantısı yöntemi:

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

Burada İEnumerables için aynı uzantı yöntemi:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Vivona

    Ben Vivona

    24 Ocak 2010
  • Brendan van Son

    Brendan van

    5 Aralık 2006
  • Julian Smith

    Julian Smith

    31 EKİM 2006