2017-04-08 2 views
2

以前、私は、私の前の質問に大きな助けを持っていたがありがとうvyrpHow do I create and populate a dynamic object using a dynamically built lambda expressionダイナミックに構築されたラムダ式を使用して動的オブジェクトIEnumerable <dynamic>を検索するにはどうすればよいですか?

私は今、動的オブジェクトを検索しているよ、と以前のように、私はこのため、オブジェクトのプロパティを知っている、としません。ランタイムまで私が探しているもの。ここで

が動的オブジェクトのビルドコードです:テストの目的のために

 // Get list of optional fields 
     var optFieldList = await _tbList_FieldRepository.GetAsync(lf => lf.ListID == listId && lf.DisplayInList == true); 
     // order list of optional fields 
     optFieldList.OrderBy(lf => lf.DisplayOrder); 

     // Get base Data excluding Inactive if applicable 
     IEnumerable<tbList_Data> primaryData = await _tbList_DataRepository.GetAsync(ld => ld.ListID == listId && (ld.IsActive == includeInactive ? ld.IsActive : true)); 

     // Build IEnumerable<dynamic> from base results plus any optional fields to be displayed in table 
     var results = primaryData.Select(pd => { 
      dynamic result = new System.Dynamic.ExpandoObject(); 
      result.Id = pd.ID; 
      result.PrimaryData = pd.PrimaryData; 
      result.DisplayOrder = pd.DisplayOrder; 
      result.IsActive = pd.IsActive; 
      foreach (var optField in optFieldList) 
      { 
       switch (optField.FieldType.ToLower()) { 
        case "text": 
         ((IDictionary<string, object>)result).Add(optField.FieldName, pd.tbList_DataText.Where(ld => ld.DataRowID == pd.ID && ld.ListColumnID == optField.ID).Select(ld => ld.DataField).DefaultIfEmpty("").First()); 
         break; 
       } 
      } 
      return result; 
     }); 

を、私は2つの動的なフィールドを持っている、「PhoneNumberの」および「FuelType」

私は(知られているフィールドを検索することができます次のように問題はありません。

 results = results.Where(r => r.PrimaryData.Contains(searchString)); 

そして、私は、設計時に

 results = results.Where(r => r.PhoneNumber.Contains(searchString)); 

が、私は何をしたいのフィールドのPhoneNumberを知っていれば、次は動作します、のようなものです:

で終わる
results = results.Where(r => r.PrimaryData.Contains(searchString) 
    || foreach(var optField in optFieldList) 
    { 
     r.optField.FieldName.Contains(searchString) 
    }) 

results = results.Where(r => 
    r.PrimaryData.Contains(searchString) 
    || r.PhoneNumber.Contains(searchString) ||  
    r.FuelType.Contains(searchString)); 

明らかにそのコードは機能しません。私はさまざまな試みを試みましたが、成功しなかったので、私は提案を探しています。おかげ

+2

どういう意味ですか?詳しく教えてください。 – CodingYoshi

+0

コンパイルエラーとは何ですか? – CodingYoshi

答えて

3

あなたは、クエリのdynamic要素がEnumerable.Any方法は、動的シミュレートするために使用することができますが、あなたが安全に、インターフェイスを辞書と名前でプロパティの値にアクセスするためにそれを使用するためにそれをキャストすることができ、実際にそれ故にIDictionary<string, object>>ExpandoObjectであることを知っているので、 ||条件:

results = results.Where(r => r.PrimaryData.Contains(searchString) 
    || optFieldList.Any(f => 
    { 
     object value; 
     return ((IDictionary<string, object>)r).TryGetValue(f.FieldName, out value) 
      && value is string && ((string)value).Contains(searchString); 
    })); 
+1

'.Cast >()' ^^ – AgentFire

+0

@AgentFireこれはクエリの結果を変更し、 'r.PrimaryData'のような事前定義されたプロパティアクセサを使用することも許可しません。 –

+0

これは完璧です、ありがとう!!!! – Mark

関連する問題