LINQ:自定义计数方法

时间:2016-12-26 06:04:24

标签: c# .net linq

我尝试实现自定义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())

ListOfModelsIQueryable的一个实例,即它必须在数据库中执行,它给了我这个错误:

  

LINQ表达式&#39; Sum()&#39;无法翻译,将在本地进行评估。

我环顾四周,看到一些答案说我必须实施IQueryableProvider,但我认为没有必要进入这样复杂的路径,因为Sum()和{{1}是可翻译的,我只需要有条件地计算。它是否可能,如果是的话,任何人都可以给我一个如何做的线索吗?

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; }
}

然后在其他方法之前使用它。