2017-01-13 7 views
0

항목을 필터링하기 위해 where 절을 사용하는 람다 식을 사용하는 동적 개체 목록이 있습니다. foo는 내가 표현을 다음 사용할 수 있습니다 false 인 경우 예를 들어, 그냥 내가 항목 목록을 필터링 할 경우는 3 곳, foo는, 바, 바즈 이제where 절의 동적 람다 식

class item // let this be current class in dynamic item list 
{ 
    bool foo; 
    string bar; 
    string baz; 
} 

을 가지고 고려

var filtered = itemList.Where("!foo"); 

난 할 수 문자열을 기준으로 목록 필터링 값 :

var filtered = itemList.Where("bar==\"value\""); \\all items with bar = value 

목록의 항목에 공백이 아닌 특정 문자열 값이 있는지 실제로 확인하고 싶습니다. I는 '형태의 파라미터를 사용할 수 없습니다 수 유형

식'System.Func`2 [DynamicType,은 System.Object]이 오류가 던진

var filtered = itemList.Where("!String.IsNullOrWhiteSpace(baz)"); 

코드 다음 시도 선택 System.String 내가 쿼리를

에 따라 얻을 결과에 성공했지만 '방법'부울 IsNullOrWhiteSpace (선택 System.String) '

이 검색어에 String.IsNullOrWhiteSpace()을 사용할 수있는 방법이 있는지 확인하고 싶습니다.

+0

문자열 값을 변경하면 하드 코딩 대신 문자열을 변수로 변경하십시오. – jdweng

+0

@jdweng, 죄송합니다, 나는 당신이 말하는 것을 얻지 못했습니다. String.IsNullOrWhiteSpace()'가 작동하지 않는 이유를 알고 싶습니다. –

답변

0

"! String.IsNullOrWhiteSpace (baz)"를 "! (baz == null || baz.Trim() == string.Empty)"로 바꿀 수 있습니다.

+0

방금 ​​시나리오를 제시하기 위해이 예제를 입력했습니다.)' –

+0

큰 따옴표로 묶여 있기 때문에 문자열입니다. 그래서 할 수 없어 : string myString = "! String.IsNullOrWhiteSpace (baz)"; – jdweng

+2

필자는 Linq가 모든 것을 SQL로 변환하여 실행한다는 것을 이해합니다. SQL에서 인식되지 않는 함수는 작동하지 않습니다. – AndyIZ

0

System.Linq.Dynamic을 살펴보면, example here입니다.

List<T>List<object>이 아닌지 확인해야합니다. 그렇지 않으면 System.Linq.Dynamic에서 속성을 찾을 수 없습니다. 여기

은 예를 들어 미리보기입니다 :

void Main() 
{ 
    var itemList = new List<dynamic>{ new {foo = true, bar = "a", baz = "b" }, new {foo = true, bar = (string)null, baz = "d" } }; 
    var filtered = itemList.ToAnonymousList().Where("bar != null and bar !=\"\""); 
    filtered.Dump(); 
} 

public static class EnumerableEx { 
    public static IList ToAnonymousList(this IEnumerable enumerable) 
    { 
     var enumerator = enumerable.GetEnumerator(); 
     if (!enumerator.MoveNext()) 
      throw new Exception("?? No elements??"); 

     var value = enumerator.Current; 
     var returnList = (IList) typeof (List<>) 
      .MakeGenericType(value.GetType()) 
      .GetConstructor(Type.EmptyTypes) 
      .Invoke(null); 

     returnList.Add(value); 

     while (enumerator.MoveNext()) 
      returnList.Add(enumerator.Current); 

     return returnList; 
    } 
} 
0

나는 당신의 표현식을 사용하여 아무런 문제가 없습니다 - 그것은 잘 작동합니다.

나는 이것을 EF 스토리지에 대해 객체와 엔티티와 함께 ​​사용했다. 타입

식 'System.Func`2 [DynamicType,은 System.Object]가'형태에있어서의 '선택 System.String'의 파라미터를 사용할 수 없습니다 수 '부울 IsNullOrWhiteSpace (선택 System.String)'

그래서, 그것은 (주위의 순서를 이동) 명시되어있는 오류보고 :

하는 Boolean를 반환 유형 System.String의 매개 변수를 예상하는 방법 IsNullOrWhiteSpace을. 받은 내용은 Expression of type System.Func``2[DynamicType,System.Object]'

입니다. 비교를 위해 문자열 값 대신 객체를 참조했을 수 있습니다.그러나 사용중인 객체에 대한 샘플 코드가없고 객체, 엔티티 또는 LinQ to SQL (사용하지 않았 음)을 사용하는지 여부는 표현식을 제공 한 대상에서만 추측 할 수 있습니다.

마지막으로,

'동적 항목 목록'은 무엇인가?

Dynamic을 사용하고 있습니까? 아니면 보통 List<Item>입니까?

+0

동적, 보통이 아님 목록