2012-01-23 6 views
3

注文(注文、製品、コスト、価格、クライアント、日)があります。 データベースから多くのレコードを取得していて、フィルタリングを容易にするために、特定の日付または特定の製品、さらには特定の価格だけを選択できるように、取得された個別の値をDropDownListsに追加する必要があります。 DropDownListのIDは、該当するフィールドの "ddl_" +名前として作成されます。私が好きな何C#linq - 実行時に選択したフィールドを変更します。

は、このような単純な配列を定義することができるようにすることです:私の問題は、私はドキュメントをたくさん見つけることです

foreach (string filterName in filterArray) 
{ 
    // Find the ddl to populate 
    DropDownList ddl = (DropDownList)this.FindControl("ddl_" + filterName); 
    // Get the data for that ddl only (use filterName in the select...) 
    var query = (from items in results select items.filterName.ToString()).Distinct(); 

    // Populate the ddl (not complete code...) 
    foreach (var item in query) 
    { 
     ddl.Items.Add(item...); 
    } 
} 

public string[] filterArray = new string[] { "Order", "Product", "Cost", "Price", "Client", "Day" }; 

その後BindDLLsメソッドを呼び出しますWHEREまたはGROUP BYまたは実行時にlinqステートメントの他の部分を変更する方法について説明します。私は検索したいフィールドを動的に変更する方法については何も見つかりません。

これを行う簡単な方法はありますか?ありがとうございました。 Yipi

編集:

List<Orders> results = OrdersService.GetOrders(); 

public class Orders 
{ 
    [DataMember] 
    public DateTime? Day 
    [DataMember] 
    public int? Order 
    [DataMember] 
    public int? Product 
    [DataMember] 
    public int? Cost 
    [DataMember] 
    public int? Price 
    [DataMember] 
    public int? Client 
    [DataMember] 
} 

答えて

2

あなたが手でラムダ式を構築することにより、この問題を解決することができます。

あなたが現在メソッドチェーンの構文を使用するように変更することができます使用して、このようになります。クエリ:

var query = results.Select(item => item.<filterName>.ToString()).Distinct(); 

は、今、私たちはDistinctに自分自身を渡されるラムダ式を作成する必要があります。

これは、以下の方法を使用して達成することができます。

Expression<Func<YourResultType, string>> CreateExpression(string propertyName) 
{ 
    var itemExpression = Expression.Parameter(typeof(YourResultType), "item"); 
    var propertyExpression = Expression.Property(itemExpression, propertyName); 
    var toStringExpression = Expression.Call(propertyExpression, 
              "ToString", null); 
    return Expression.Lambda<Func<YourResultType, string>>(toStringExpression, 
                  itemExpression); 
} 

今、私たちはこれにクエリを変更することができます。

var query = results.Select(CreateExpression(filterName)).Distinct(); 

を使用すると、インスタンスのタイプにYourResultTypeを変更する必要があることに注意してくださいあなたのresults変数にまた、あなたは、データベースを照会していないが、メモリのリストに、あなたはこれにクエリを変更する必要があり、場合:

var query = results.Select(CreateExpression(filterName).Compile()).Distinct(); 
+0

私は式ツリーに精通していないです申し訳ありません - オブジェクト 'results'は単純なリストです。あなたのコードを使用するとき、私はそれを入力するとすぐにエラーを取得します。私が見なければならないドキュメントのポインタ?ありがとう。 – yipiha

+0

あなたが私に*あなたが得ているエラーを教えたら、私は助けることができるかもしれません。 –

+0

申し訳ありません - これは私が見るものです:..................... System.Collections.Generic.List 'には' Distinct 'の定義が含まれていません。最高の拡張メソッドオーバーロード 'System.Linq.Enumerable.Distinct (System.Collections.Generic.IEnumerable 、System.Collections.Generic.IEqualityComparer )'に無効な引数がいくつかあります。 .Argument 2: 'System.Func 'から 'System.Collections.Generic.IEqualityComparer 'に変換することはできません。 – yipiha

関連する問題