当前位置: 首页 > 编程语言 > C#

子集合的表达式列表 .Any分享

时间:2023-04-11 03:11:19 C#

C#学习教程:子集合的表达式列表在子集合上创建表达式时卡住了。由于类型不兼容,方法调用爆炸。通常我知道该放什么,但Any()方法调用让我感到困惑。我已经尝试了所有我能想到的类型,但没有成功。任何帮助将不胜感激。这是我的实体类:publicclassStory:Entity{publicstringAuthor{get;放;}公共IList贡献者{得到;放;我的查询生成表达式树:varstories=newList();故事.Where(p=>p.Author.Contains("Test")||p.Contributors.Any(c=>c.Contains("Test")));到目前为止我得到了什么publicinterfaceIFilterCriteria{string}objectValueToCompare{get;放;}FilterOperatorFilterOperator{get;放;}boolIsList{得到;放;}表达式表达式{get;放;}}publicstaticIQueryableFilter(thisIQueryablequery,IListfilterCriterias,LogicalOperatorlogicalOperator=LogicalOperator.And){if(filterCriterias!=null&&filterCriterias.Any()){varresultCondition=filterCriterias.ToExpression(query,logicalOperator);varparameter=Expression.Parameter(query.ElementType,"p");if(resultCondition!=null){varlambda=Expression.Lambda(resultCondition,parameter);varmce=Expression.Call(typeof(Queryable),"Where",new[]{query.ElementType},query.Expression,lambda);返回查询.Provider.CreateQuery(mce);}}返回查询;}publicstaticExpressionToExpression(thisIListfilterCriterias,IQueryablequery,LogicalOperatorlogicalOperator=LogicalOperator.And){ExpressionresultCondition=null;如果(filterCriterias.Any()){varparameter=Expression.Parameter(query.ElementType,"p");foreach(varfilterCriteriainfilterCriterias){varpropertyExpression=filterCriteria.PropertyToCompare.Split('.').Aggregate(null,(current,property)=>Expression.Property(current??(parameterasExpression),property));表达式值表达式;varconstantExpression=Expression.Constant(filterCriteria.ValueToCompare);如果(!filterCriteria.IsList){valueExpression=Expression.Convert(constantExpression,propertyExpression.Type);}else{valueExpression=Expression.Call(typeof(Enumerable),"Any",new[]{typeof(string)},propertyExpression,filterCriteria.Expression,Expression.Constant(filterCriteria.ValueToCompare,typeof(string)));}表达式条件;开关(filterCriteria.FilterOperator){caseFilterOperator.IsEqualTo:condition=Expression.Equal(propertyExpression,valueExpression);休息;caseFilterOperator.IsNotEqualTo:条件=Expression.NotEqual(propertyExpression,valueExpression);休息;caseFilterOperator.IsGreaterThan:condition=Expression.GreaterThan(propertyExpression,valueExpression);休息;caseFilterOperator.IsGreaterThanOrEqualTo:条件=Expression.GreaterThanOrEqual(propertyExpression,valueExpression);休息;caseFilterOperator.IsLessThan:condition=Expression.LessThan(propertyExpression,valueExpression);休息;caseFilterOperator.IsLessThanOrEqualTo:条件=Expression.LessThanOrEqual(propertyExpression,valueExpression);休息;caseFilterOperator.Contains:条件=Expression.Call(propertyExpression,typeof(string).GetMethod("包含",new[]{typeof(string)}),valueExpression);休息;caseFilterOperator.StartsWith:条件=Expression.Call(propertyExpression,typeof(string).GetMethod("StartsWith",new[]{typeof(string)}),valueExpression);休息;caseFilterOperator.EndsWith:条件=Expression.Call(propertyExpression,typeof(string).GetMethod("EndsWith",new[]{typeof(string)}),valueExpression);休息;默认值:条件=值表达式;休息;}if(resultCondition!=null){switch(logicalOperator){caseLogicalOperator.And:resultCondition=Expression.AndAlso(resultCondition,condition);休息;caseLogicalOperator.Or:resultCondition=Expression.OrElse(resultCondition,条件);休息;}}else{resultCondition=条件;}}}返回结果条件;这就是我使用表达式的方式:varstories=newList();var过滤器=新列表();filter.Add(newFilterCriteria{ValueToCompare="测试",PropertyToCompare="作者",FilterOperator=FilterOperator.Contains});表达式func=t=>t.Contains("测试");filter.Add(newFilterCriteria{ValueToCompare="Test",PropertyToCompare="Contributors",FilterOperator=FilterOperator.Contains,Expression=func});stories.Filter(filters,LogicalOperator.Or).ToList();但是在运行这段代码之后,我得到了这个错误,我无法解决'System.Linq.Queryable'类型上没有泛型方法'Any'与提供的类型参数和参数兼容如果该方法是非泛型的,则不应提供任何类型参数.说明:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。异常详细信息:System.InvalidOperationException:类型“System.Linq.Queryable”上没有与提供的类型参数和参数兼容的泛型方法“Any”。如果该方法是非泛型的,则不应提供任何类型参数。源错误:第184行:{第185行:varoverload=typeof(Queryable).GetMethods()。单(mi=>mi.Name==“任何”&&mi.GetParameters()。数()==2);第186行:Expression.Call(typeof(queryable),"any",new[]{typeof(string)},propertyExpressionor);第187行:valueExpression=Expression.Call(typeof(Enumerable),"Any",new[]{typeof(string)},propertyExpression,orExpression.Constant("Test",你不需要调用Any方法您代码中的任何位置。你应该扩展包含,例如:找到AsQueryable方法vartoQueryable=typeof(Queryable).GetMethods().Where(m=>m.Name=="AsQueryable").Single(m=>m.IsGenericMethod).MakeGenericMethod(typeof(string));//找到任何方法varmethod=typeof(Queryable).GetMethods().Where(m=>m.Name=="Any").Single(m=>m.GetParameters().Length==2).MakeGenericMethod(类型(字符串));//使表达式条件=Expression.Call(null,method,Expression.Call(null,toQueryable,propertyExpression),filterCriteria.Expression);}else{condition=Expression.Call(propertyExpression,typeof(string).GetMethod("Contains",new[]{typeof(string)}),valueExpression);}休息;你也应该创建一个p参数(Expression.Parameter(query.ElementType,"p")),否则您将获得从范围“”引用的类型为“WpfApplication2.Story”的变量“p”,但未定义错误您可以将参数从Filter方法传递给ToExpression方法。以上就是C#学习教程:子集合的表达式列表。Any分享的所有内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: