我正在尝试创建一个扩展“WhereNot”
所以我可以使用:
Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)
请注意,我的目标是学习 linq 表达式;不能解决我的问题。
我创建了这个函数:
<Extension()> _
Public Function WhereNot(Of TElement)(ByVal source As IQueryable(Of TElement), ByVal selector As Expression(Of Func(Of TElement, Boolean))) As IQueryable(Of TElement)
Return source.Where(GetWhereNotExpression(selector))
End Function
我不知道如何切换布尔标志,Negate 函数可以做到这一点吗?
欢迎使用 vb.net 和 C# 的答案
我意识到这是一个非常古老的已回答问题,但我认为所选答案具有误导性,因为提问者正在寻找表达式,而所选答案提供了 lambda。
这意味着从 IQueryable 调用将返回IEnumerable<T>
,不是一个IQueryable<T>
。这会强制表达式进行编译,并可能导致对 Linq 提供程序的访问优化不佳。
这是直接解决原始问题的答案。
public static class NegationExpressionHelper
{
public static IQueryable<T> WhereNot<T>(this IQueryable<T> queryable, Expression<Func<T,bool>> predicate)
{
return queryable.Where(predicate.Invert());
}
public static Expression<Func<T, bool>> Invert<T>(this Expression<Func<T, bool>> original)
{
return Expression.Lambda<Func<T, bool>>(Expression.Not(original.Body), original.Parameters.Single());
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)