我尝试实现自定义LinQ Count()
方法。基本上我在这里尝试实现的是在调用Count方法之前,我想过滤掉属性IsDeleted
设置为true的所有元素。所以,我创建了一个扩展类,并添加了这些方法:
public static int Count2<T>(this IEnumerable<T> source, Func<T, bool> selector)
where T : Model
{
return source.Where(x => !x.IsDeleted).Count(selector);
}
public static int Count2<T>(this IQueryable<T> source, Expression<Func<T, bool>> selector)
where T : Model
{
return source.Where(x => !x.IsDeleted).Count(selector);
}
public static int Count2<T>(this IEnumerable<T> source)
where T : Model
{
return source.Count(x => !x.IsDeleted);
}
public static int Count2<T>(this IQueryable<T> source)
where T : Model
{
return source.Count(x => !x.IsDeleted);
}
这只适用于本地集合,但在执行此命令时例如:
ListOfModels.Sum(x => x.PropertyThatIsAList.Count2())
和ListOfModels
是IQueryable
的一个实例,即它必须在数据库中执行,它给了我这个错误:
LINQ表达式&#39; Sum()&#39;无法翻译,将在本地进行评估。
我环顾四周,看到一些答案说我必须实施IQueryableProvider
,但我认为没有必要进入这样复杂的路径,因为Sum()
和{{1}是可翻译的,我只需要有条件地计算。它是否可能,如果是的话,任何人都可以给我一个如何做的线索吗?
答案 0 :(得分:2)
我建议您使用像Validate()
这样的扩展方法而不是自定义所有LinQ方法:
public static IEnumerable<T> Validate<T>(this IEnumerable<T> list) where T: IDeleteable
{
return list.Where(w => !w.IsDeleted);
}
IDeleteable
接口是这样的:
public interface IDeleteable
{
bool IsDeleted { get; set; }
}
然后在其他方法之前使用它。