我这几天使用EF Core开发网站的时候,突然想试着开发自己的Linq扩展表达式,因为EF Core对IQueryable泛型类型,有很多异步表达式的支持。比如,在项目中只要添加了对EF Core命名空间的using支持,那么IQueryable泛型类型就可以使用FirstAsync等函数。
于是我先查看一下IQueryable类型的Where函数结构,发现该Where函数是因为基于IEnumerable类型才可以通过System.Linq命名空间添加对Where函数的支持。
IEnumerable类型的Where函数结构为如下,通过foreach实现对自身中所有元素的遍历,并同yield关键字在循环中实现IEnumerable的泛型对象返回值:
//提示:该函数结构会一直变化
private static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
{
int index = -1;
foreach (TSource element in source)
{
checked
{
index++;
}
if (predicate(element, index))
{
yield return element;
}
}
}
而IAsyncEnumerable泛