如何:将异步方法与 LINQ 自定义扩展方法结合使用

How to: Use async methods with LINQ custom extension method

我有一个 LINQ 自定义扩展方法:

public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, Func<T, TKey> property)
{
    return items.GroupBy(property).Select(x => x.First());
}

我是这样使用它的:

var spc = context.pcs.DistinctBy(w => w.province).Select(w => new
            {
                abc = w
            }).ToList();

但问题是我不想要 ToList() 我想要这样的东西

var spc = await context.pcs.DistinctBy(w => w.province).Select(w => new
             {
                 abc = w
             }).ToListAsync();

使用异步。但是找不到异步。我怎样才能让我的自定义方法 distinctBy 这样我也可以异步使用它?

ToListAsync() 扩展方法正在扩展 IQueryable<T>,但您的 DistinctBy() 方法正在扩展(并返回)IEnumerable<T>

显然,ToListAsync() 不适用于 IEnumerable<T>,因为它使用 Linq-To-Objects(内存中)并且无法潜在地阻塞(不涉及 I/O)。

试试这个:

public static IQueryable<T> DistinctBy<T, TKey>(this IQueryable<T> items, Expression<Func<T, TKey>> property)
{
    return items.GroupBy(property).Select(x => x.First());
}

请注意,我还将 property 参数从 Func<> 更改为 Expression<Func<>> 以匹配 Queryable.GroupBy(并避免 Enumerable.GroupBy)。

MSDN