3

フィルタリング用に各ヘッダーにドロップダウンボックスがあるグリッドビューがあります。各フィルターには、ロード時にその列とは異なる値がロードされます。実行時に「ALL」を追加して、ユーザーがそのフィールドからすべてを選択できるようにします。ドロップダウンボックスが「ALL」に設定されている場合、フィールドを無視するようにlinqステートメントを動的に作成しようとしています。これは可能ですか?これを1つのステートメントで実行できるかどうかを確認したいと思います。以下の例は2つのドロップダウンボックスのみを示していますが、私の実際のケースには最大5つあります。

if thenステートメントを使用することを選択した場合、最終的にスパゲッティコードになります。

DropDownList drpOwners = this.grdOtherQuotes.HeaderRow.FindControl("drpOwners") as DropDownList;                     
DropDownList drpCompanyName = this.grdOtherQuotes.HeaderRow.FindControl("drpCompanyName") as DropDownList;

var filteredList = (from x in allQuotes
                          where (drpOwners.SelectedValue != ALL) ? x.SalesRepFullName == drpOwners.SelectedValue:true                                    
                                && drpCompanyName.SelectedValue != ALL ? x.CompanyName == drpCompanyName.SelectedValue: true
                          select x);
4

3 に答える 3

10

個人的には、これを分割する方が簡単だと思います。

IEnumerable<Quote> filteredList = allQuotes;
// If using EF or LINQ to SQL, use: IQueryable<Quote> filteredList = allQuotes;
if (drpOwners.SelectedValue != ALL) 
   filteredList = filteredList.Where(x => x.SalesRepFullName == drpOwners.SelectedValue);
if (drpCompanyName.SelectedValue != ALL) 
   filteredList = filteredList.Where(x => x.CompanyName == drpCompanyName.SelectedValue);
// More conditions as needed

これは実際にはもう長くはなく、従うのははるかに簡単です。


これを「ワンライナー」として本当に書きたい場合は、クエリを作成するための拡張メソッドを作成できます。たとえば、Entity Frameworkを使用している場合:

static IQueryable<T> AddCondition(this IQueryable<T> queryable, Func<bool> predicate, Expression<Func<T,bool>> filter)
{
     if (predicate())
         return queryable.Where(filter);
     else
         return queryable;
}

これにより、次のように記述できます。

var filteredList = allQuotes
                     .AddCondition(() => drpOwners.SelectedValue != ALL, x => x.SalesRepFullName == drpOwners.SelectedValue)
                     .AddCondition(() => drpCompanyName.SelectedValue != ALL, x.CompanyName == drpCompanyName.SelectedValue);

もちろん、これをさらに進めて、述語を「ALL」に対してチェックするように述語を配線するバージョンを作成して、述語を短くすることもできます(コンボボックスのみ)。

于 2012-10-16T16:45:12.120 に答える
1

Allロジックを処理するヘルパーメソッドを作成できます。何かのようなもの:

private bool CompareSelectedValue(string value, string dropDownValue)
{
  if(dropDownValue == "ALL")
    return true;
  else
    return value == dropDownValue;
}

次に、クエリは次のようになります。

var filteredList = (from x in allQuotes
                          where (CompareSelectedValue(x.SalesRepFullName, drpOwners.SelectedValue)                                    
                                && CompareSelectedValue(x.CompanyName, drpCompanyName.SelectedValue)
                          select x);
于 2012-10-16T16:50:26.340 に答える
0

whereロジックをカプセル化して、見た目がすっきりする拡張メソッドを作成します。

var filteredList = allQuotes.WhereDropOwnersAreContained()
                            .WhereCompanyIsContained()
                            ...
                            ;
于 2012-10-16T16:59:33.427 に答える