C# y、 右体), _=>抛出新ArgumentOutOfRangeException(nameof(condition)), },左。参数); } 类SwapVisitor:ExpressionVisitor { 私有只读表达式_from,_to; 公共Sw

C# y、 右体), _=>抛出新ArgumentOutOfRangeException(nameof(condition)), },左。参数); } 类SwapVisitor:ExpressionVisitor { 私有只读表达式_from,_to; 公共Sw,c#,linq,.net-5,sql-to-linq-conversion,C#,Linq,.net 5,Sql To Linq Conversion,y、 右体), _=>抛出新ArgumentOutOfRangeException(nameof(condition)), },左。参数); } 类SwapVisitor:ExpressionVisitor { 私有只读表达式_from,_to; 公共SwapVisitor(表达式from,表达式to) { _from=from; _to=to; } 公共重写表达式访问(表达式节点) =>ReferenceEquals(节点,\u-from)?\u-to:base.Visit(节点); } 公共

y、 右体), _=>抛出新ArgumentOutOfRangeException(nameof(condition)), },左。参数); } 类SwapVisitor:ExpressionVisitor { 私有只读表达式_from,_to; 公共SwapVisitor(表达式from,表达式to) { _from=from; _to=to; } 公共重写表达式访问(表达式节点) =>ReferenceEquals(节点,\u-from)?\u-to:base.Visit(节点); } 公共静态void Main(字符串[]args) { //或条件 条件=条件。或; var animalsQuery=anists.AsQueryable(); //循环所有搜索值以扩展查询 表达式谓词=null; foreach(FilterValue中的FilterValue FilterValue) { 开关(filterValue.LikeType) { case-LikeType.Left://类似于“%value” 谓词=组合(条件,谓词,动物=>animal.Name.EndsWith(filterValue.Value),filterValue.IsNegated); 打破 case-LikeType.Right://LIKE'value%' 谓词=组合(条件,谓词,动物=>animal.Name.StartsWith(filterValue.Value),filterValue.IsNegated); 打破 case LikeType.LeftAndRight://类似于“%value%” 谓词=组合(条件,谓词,动物=>animal.Name.Contains(filterValue.Value),filterValue.IsNegated); 打破 case-LikeType.Equals://Like'value' 谓词=组合(条件,谓词,动物=>animal.Name==filterValue.Value,filterValue.IsNegated); 打破 } } if(谓词不为null) { animalsQuery=animalsQuery.Where(谓词); } var result=animalsQuery.ToList(); } ///要筛选的值 公共静态列表动物=新() { new(){Name=“Lenny”}, new(){Name=“Gideon”}, new(){Name=“Shania”}, new(){Name=“Jada”}, new(){Name=“Kamil”}, new(){Name=“Fariha”}, }; ///搜索值 公共静态列表FilterValues=new() { new(){Value=“a”,LikeType=LikeType.Left}, new(){Value=“n”,LikeType=LikeType.Right}, new(){Value=“f”,LikeType=LikeType.LeftAndRight}, new(){Value=“k”,LikeType=LikeType.Equals}, }; } 公营动物 { 公共字符串名称{get;set;} } 公共类FilterValue { 公共字符串值{get;set;} 公共bool被否定{get;set;} 公共LikeType LikeType{get;set;} } 公共枚举类类型 { 左=1, 右=2, LeftAndRight=3, 等于等于4, } 公共枚举条件 { And=1, Or=2, } }
如果
都相等,而不是不相等,则问题很容易解决-使用
包含
(即有一个
列表
)。这在
中不太适用=唉。与其链接多个
Where
调用,不如为每个条件创建一个lambda,将这些lambda与
&&
和/或
|
运算符组合,然后使用组合结果进行一个
Where
调用。您可能需要一个PredicateBuilder;也就是说,一个可以创建和组合linq查询谓词的类。它通常包括OR、NOT、XOR、TRUE和FALSE的方法。它的输入是指向item类的属性或lambda getter表达式的名称(在您的示例中为“动物”)@mjwills,但这样我就不能将
StartsWith
EndsWith
结合起来。所有“以A开头”和“以E结尾”的动物<代码>从“动物”中选择*,其中“名称”如“A%”和“名称”如“%E”@TheBigno这是正确的。非常感谢。这很好用。
Combine
的开头有一个小错误。如果第一个/单个
right
值出现
left==null
right!=null
negateRight==true
,则
右侧
不会被否定<代码>如果(左为空)返回否定右?Lambda(Expression.Not(right.Body)、right.Parameters):右@TheBigNeo够公平的!