ใช้เข้าชมการแสดงออกในการตรวจสอบการอ้างอิงถึง string.IsNullOrWhiteSpace (x == null || x.Trim() == string.Empty)
และทำลายพวกเขาลงไปในการแสดงออกที่เรียบง่าย
ดังนั้นด้านล่างคือผู้เข้าชมเพิ่มเติมและวิธีการต่อเติมเพื่อใช้ประโยชน์จากมัน มันไม่จำเป็นต้องใช้การตั้งค่าพิเศษใด ๆ เพียงแค่เรียก 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 เป็น sql / เอนทิตี) และแปลงเป็น sql
List<string> my = new List<string>(); var i = from m in my where !string.IsNullOrWhiteSpace(m) select m;