2017-04-08 4 views
2

이전에, 내가, 내 앞의 질문에 큰 도움을했다가 감사합니다 vyrp , How do I create and populate a dynamic object using a dynamically built lambda expression동적으로 생성되는 람다 식을 사용하여 동적 개체 IEnumerable <dynamic>을 검색하는 방법은 무엇입니까?

지금 동적 객체를 검색 할 찾고 있어요, 이전과 같이, I 따라서 객체의 속성을 알고하지 않습니다 내가 런타임까지 찾고있는 것. 여기

동적 오브젝트 빌드 코드입니다 : 테스트의 목적

 // 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"

나는 (알려진 필드를 검색 할 수 있습니다 s) 즉, PrimaryData, 문제 없음, 아래와 같습니다.

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

내가 디자인 타임에 필드 PHONENUMBER를 알고있는 경우 다음이 작동

 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 요소가 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

관련 문제