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

  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • Huot Media

    Huot Media

    7 Mayıs 2010
  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008