2017-04-08 95 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