expression 방문자를 사용하여 string.IsNullOrWhiteSpace에 대한 참조를 감지하고 더 간단한 표현식으로 분류하십시오 (x == null || x.Trim() == string.Empty)
.
아래는 확장 방문자와이를 이용하는 확장 방법입니다. 특별한 설정이 필요하지 않습니다. Where 대신 WhereEx를 호출하면됩니다.
public class QueryVisitor: ExpressionVisitor
{
protected override Expression VisitMethodCall(MethodCallExpression node)
{
if (node.Method.IsStatic && node.Method.Name == "IsNullOrWhiteSpace" && node.Method.DeclaringType.IsAssignableFrom(typeof(string)))
{
//!(b.Diameter == null || b.Diameter.Trim() == string.Empty)
var arg = node.Arguments[0];
var argTrim = Expression.Call(arg, typeof (string).GetMethod("Trim", Type.EmptyTypes));
var exp = Expression.MakeBinary(ExpressionType.Or,
Expression.MakeBinary(ExpressionType.Equal, arg, Expression.Constant(null, arg.Type)),
Expression.MakeBinary(ExpressionType.Equal, argTrim, Expression.Constant(string.Empty, arg.Type))
);
return exp;
}
return base.VisitMethodCall(node);
}
}
public static class EfQueryableExtensions
{
public static IQueryable<T> WhereEx<T>(this IQueryable<T> queryable, Expression<Func<T, bool>> where)
{
var visitor = new QueryVisitor();
return queryable.Where(visitor.VisitAndConvert(where, "WhereEx"));
}
}
따라서 실행 myqueryable.WhereEx(c=> !c.Name.IsNullOrWhiteSpace())
하면 !(c.Name == null || x.Trim() == "")
무엇이든지 (linq to sql / entities) 전달되고 sql 로 변환 되기 전에로 변환됩니다.
List<string> my = new List<string>(); var i = from m in my where !string.IsNullOrWhiteSpace(m) select m;