Shi*_*mmy 3 .net linq expression expression-trees linq-expressions
我正在尝试创建一个扩展名"WhereNot"
所以我可以用:
Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)
Run Code Online (Sandbox Code Playgroud)
请注意,我的目标是学习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
Run Code Online (Sandbox Code Playgroud)
我不知道如何切换布尔标志,函数Negate会这样做吗?
vb.net和C#的答案都很受欢迎
sma*_*man 11
我意识到这是一个非常古老的回答问题,但我认为选择的答案是误导性的,因为提问者正在寻找表达式,并且所选答案提供了一个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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1348 次 |
| 最近记录: |