2017-12-12 35 views
1
var people = new[] { 
       new myUserListObject { userobj = new User { Email = "[email protected]"},Session=3 }, 
       new myUserListObject { userobj= new User { Email = null }, Session=4} 
      }; 
var peopList = people.ToList(); 
var parameterExp = Expression.Parameter(typeof(myUserListObject), "type"); 
Expression propertyExp = Expression.Property(parameterExp, "userobj"); 
propertyExp = Expression.Property(propertyExp, "Email"); 
MethodInfo methodd = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
var someValued = Expression.Constant("gmail", typeof(string)); 
var containsMethodExpd = Expression.Call(propertyExp, methodd, someValued); 
var resxx = Expression.NotEqual(propertyExp, Expression.Constant(null, propertyExp.Type)); 
var togerther = Expression.And(resxx, containsMethodExpd); 
var toglamb = Expression.Lambda<Func<myUserListObject, bool>>(togerther, parameterExp); 
var tt = peopList.AsQueryable().Where(toglamb).ToList(); //toglamb is {type => ((type.userobj.Email != null) And type.userobj.Email.Contains("gmail"))} 

동적 조건부 작성기를 사용하고 있습니다. 하지만 nullable 값 때문에 나던 작업이 포함되어 있습니다. 및 lastline throw 'System.NullReferenceException :'개체 참조가 개체의 인스턴스로 설정되지 않았습니다. '마누엘 표현식 빌더에는 목록의 null 값 때문에 작업이 포함되어 있지 않습니다.

아무도 도와주세요? 내 잘못은 어디 있니? 영어로 너무 유감스럽게 생각해서 죄송합니다.

답변

2

Expression.And은 인 연산자는 & 연산자이며, 양쪽 모두를 평가합니다. 당신은 Expression.AndAlso을 원합니다 - &&

+0

@ marc-gravel Expression.And에 너무 감사드립니다. 내 문제를 해결했습니다. 마지막 질문을 할 수 있습니까? 어느 것이 매핑 할 || 사인? 또는 OrElse, OrAssign. – TnasuH

+0

'||'는'OrElse'에 매핑됩니다 –

+0

정말 고맙습니다. 좋은 하루 되세요! 행복한 코딩 :) – TnasuH