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.
- Ürün Numarası - TagsHeaders katılmış olabilir başka bir tablodan Geliyor.
- PO Numarası - TagsHeaders tablo içinde bir alan.
- Sipariş Numarası - PO Benzer # sadece farklı bir sütun.
- 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
Ö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;
}
C# 4.0, isteğe bağlı parametreler ve p...
SERİ: SingleOrDefault vs FirstOrDefaul...
Neden C# 4 isteğe bağlı parametreler a...
HTML: Vardır, ya da, isteğe bağlı kapa...
Nasıl isteğe bağlı yöntemler ile bir p...