2017-04-08 47 views
2

以前,我對我剛纔的問題有很大的幫助,謝謝vyrpHow do I create and populate a dynamic object using a dynamically built lambda expression如何使用動態構建的lambda表達式搜索動態對象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個動態字段,「******中國」和「FuelType」

我可以搜索已知的領域( s)即PrimaryData,沒問題,如下所示。

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

如果我知道在設計時的場******中國下面的工作

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

,但我想要做的,是一樣的東西:

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元素實際上是ExpandoObject,因此IDictionary<string, object>>,你可以放心地將它轉換到詞典的界面和使用它的名字來訪問屬性值,而Enumerable.Any方法可以用來模擬動態||條件:

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