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

  • FASHTAG

    FASHTAG

    5 EYLÜL 2012
  • Friday NightFort

    Friday Night

    15 EYLÜL 2011
  • Attempts at least

    Attempts at

    1 Ocak 2007