我需要创建一个扩展方法,该方法将List<TSource>
根据验证规则列表过滤集合List<<IRule>, bool>
。但是我收到错误消息VisitSubQueryExpression method is not implemented
,但看不到/找不到问题的原因。
这是我的扩展方法:
public static List<TSource> ValidItems<TSource>(this IQueryable<TSource> source,
List<IValidationRule<TSource>> validationRules)
{
return source.Where(testableItem =>
validationRules.All(rule => rule.RulePassed(testableItem))).ToList();
}
IRule界面:
public interface IValidationRule<T> //with implementation class ValidationRule<T>
{
Func<T, bool> RulePassed { get; set; }
//... +other code
}
扩展方法调用样本
//initialization of List<SampleType> listToValidate = ...
var validItems = listToValidate.ValidItems(
new List<IValidationRule<SampleType>() {
new ValidationType<SampleType> {
RulePassed = (s) => string.IsNullOrWhiteSpace(SampleType.Name),
//...initalize other ValidationType parameters
}
});
此示例应过滤listToValidate列表并删除所有SampleType实例,其Name属性为Null或空白
我的扩展方式有什么问题?此“ VisitSubQueryExpression方法未实现”错误是什么意思?
如果我将其更改为List<TSource>
不是的扩展方法,IQueryable<TSource>
则可以使用!为什么?
替换this IQueryable<TSource>
为this List<TSource>
,为什么有效?Where
方法应该适用于IQueryable<T>
(继承自IEnumerable<T>
),不是吗?
public static List<TSource> ValidItems<TSource>(this List<TSource> source,
List<IValidationRule<TSource>> validationRules)
{
return source.Where(testableItem =>
validationRules.All(rule => rule.RulePassed(testableItem))).ToList();
}
您rule.RulePassed
的IQueryable提供程序无法翻译您的内容。
public static List<TSource> ValidItems<TSource>(this IQueryable<TSource> source,
List<IValidationRule<TSource>> validationRules)
{
var result = new List<TSource>();
foreach (var testableItem in source)
{
if (validationRules.All(rule => rule.RulePassed(testableItem))
{
result.Add(testableItem);
}
}
return result;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句