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});表达式
