2014-11-27 2 views
1

런타임시 빌드되는 표현식으로 필터링하려는 객체 목록이 있습니다. 마지막 표현식은 여러 조건을 포함하며 & & 또는 ||, 절이 포함 된 절이 결합되어 있습니다. 각 조건은 다음과 같습니다.TryParse 및 Convert C#으로 표현식 트리 생성

x => x.ValueType == 1 && x.Value == "abc" 

확인 된 것처럼 두 가지 속성 만 있습니다. ValueType이 1이면 Value은 항상 문자열입니다. ValueType이 2이면 Value은 항상 double로 변환 할 수있는 문자열을 포함해야합니다.

속성 Value은 문자열 유형입니다. 조건에서보다 큰 연산자 (>)를 ​​사용하는 경우 Value을 double로 변환해야합니다. 그래서이 경우에는 표현의 몸은 다음과 같습니다 : 예상대로 여기까지, 모든 것이 작동

$x.ValueType == 2 & .Call System.Convert.ToDouble($x.Value) > 5 

.

문제 :이 목록 (치 형 == 2 & & 값> 5) 위의 식을 사용하는 경우

가 :

var list = new List<Item>(); 
list.Add(new Item { ValueType = 1, Value = "abc" }); 
list.Add(new Item { ValueType = 1, Value = "def" }); 
list.Add(new Item { ValueType = 2, Value = "25" }); 
list.Add(new Item { ValueType = 2, Value = "37" }); 
var results = list.AsQueryable().Where(expression); 

나는 FormatException을 얻을 : 입력 문자열이 아니었다 올바른 형식. ValueType 조건이 이미 false를 반환하기 때문에 요소 1과 2를 double로 변환하려고하지 않을 것이라고 생각했습니다. 그러나 나는 틀렸다.

두 값으로 변환하기 전에 이러한 모든 값을 TryParse해야합니까? 아니면 단일 문자열 속성 대신 각 값 유형에 대한 속성을 사용해야합니까? 표현식 트리에 TryParse을 삽입하려고했지만 어떻게 된 것인지 모르겠다. ...

개체 모델을 여러 속성으로 변경하면 많은 변경이 발생하므로이 "솔루션"을 피하려고합니다.

이 문제를 처리하는 방법을 알고있는 사람이있을 것입니다. 아니면 적어도 올바른 방향으로 나를 가리킬 수 있습니다.

답변

0

C#의 단락 회로 평가에 & 대신 &&을 사용하십시오.

void Main() 
{ 
    Func<Item, bool> expression = x => x.ValueType == 2 && Convert.ToDouble(x.Value) > 5; 
    var list = new List<Item>(); 
    list.Add(new Item { ValueType = 1, Value = "abc" }); 
    list.Add(new Item { ValueType = 1, Value = "def" }); 
    list.Add(new Item { ValueType = 2, Value = "25" }); 
    list.Add(new Item { ValueType = 2, Value = "37" }); 
    var results = list.AsQueryable().Where(expression); 

    results.Dump(); 
} 

public class Item 
{ 
    public int ValueType {get;set;} 
    public string Value {get;set;} 
} 
+0

고마워요! 그건 :) – Marc