これは少し "多すぎる"ように見えるかもしれませんが、これは私を拾っています!包含的な "フィルタ"を含むCONTAINSメソッドのLINQ構文
ユーザに包括的なフィルタとして機能するCheckBoxListを持つフォームを想定します。
このユーザーは、フォームに必要事項を入力し、必要なフィルタ内の項目をチェックし、オフにします。
私は、次のLINQ文を書くための簡潔な方法を探しています:
NO項目がチェックされていない場合は、すべてのユーザーの選択によってフィルタリング 他 表示結果
を結果であることを示します基本的に同じクエリですが、Containsメソッドを使用しない条件文を使用せずにこれを書くことは可能でしょうか?
私はWhere節に三項演算子を入れようとしましたが、コンパイラはまったく好きではありませんでした。
System.Collections.Generic.List catIds = new System.Collections.Generic.List();
var filteredQry = catIds.Any() ? qry.Where(x => catIds.Contains(x.Id)) : qry;
this.gvSchedule.DataSource = filteredQry.OrderBy(x => x.Category)
.ThenBy(x => x.Carrier)
.ToArray();
または::
if(catIds.Any())
qry = qry.Where(x => catIds.Contains(x.Id));
this.gvSchedule.DataSource = qry.OrderBy(x => x.Category)
.ThenBy(x => x.Carrier)
.ToArray();
をあなたはまたExpression<Func<Foo, bool>>
フィルタを使用して試してみて、「常に真」述語または本物のフィルタに割り当てることができだけでないのはなぜ
foreach (ListItem lstItemCategory in lstCategories.Items)
{
if (lstItemCategory.Selected)
{
catIds.Add(Convert.ToInt64(lstItemCategory.Value));
}
}
var qry = from rategroup in rategroups
from rate in rategroup.Rates
orderby rate.RateClass.Id descending
select new
{
Category = rate.Product.ProductCategories[0].Category.Description,
rate.Product.Description,
Carrier = rate.CarrierName,
Id = rate.Product.ProductCategories[0].Id
};
this.gvSchedule.DataSource = qry.Where(x => catIds.Contains(x.Id)).OrderBy(x => x.Category).ThenBy(x => x.Carrier).ToArray();
this.gvSchedule.DataBind();
同じことを言うつもりでしたが、三項演算子の代わりにifを使用しました。 :) –