SingleOrDefaultAsync:它究竟意味着什么?

时间:2018-05-17 15:33:54

标签: c# linq async-await

作为处理'old' C#的人,现在我正在加速进入ASP.NET,我想知道是否有人可以帮我解决这个简单的例子。
内置向导生成如下代码:

var product = await _context.Products.SingleOrDefaultAsync(m => m.ProductId == id);

现在,lamba表达式m => m.ProductId == id我能得到什么?为什么不能只是:

var product = await _context.Products.SingleOrDefaultAsync(m.ProductId);

我正在尝试阅读文档,但这只会增加我的困惑。它的文件查询是:

public static Task<TSource> SingleOrDefaultAsync<TSource>(
    this IQueryable<TSource> source
)

所以...它返回一个任务是什么意思?是通用的吗?什么是<TSource>在那里做了3次?

任何提及澄清这一点的一般阅读都会受到高度赞赏......这些是什么叫做表达树?这是Linc ......?我从哪里开始?等...

谢谢!

1 个答案:

答案 0 :(得分:1)

因此SingleOrDefaultAsync的正确重载documentation的签名为:

public static Task<TSource> SingleOrDefaultAsync<TSource>(
    this IQueryable<TSource> source,
    Expression<Func<TSource, bool>> predicate
)

这是extension method,由第一个参数前面的this表示。扩展方法是一种静态方法,使用(语法上)就像它是一个成员方法一样。

因此,第一个参数source将是_context.Products

第二个参数是Expression<Func<>>,这意味着编译器会将传入的lambda expression转换为代表代码的Expression数据结构。 lambda表达式用于指定正在执行的查询的任何所需条件,例如:您可以m => m.ProductId == id && m.Active排除已停用的产品。

因此,您的第二个参数predicatem => m.ProductId == id作为Expression树,该方法可以转换为SQL并发送到数据库。

最后,返回类型Task<>表示该方法将被执行asynchronously,您将立即获得一个Task对象,一旦可用,您可以使用该对象获取实际结果

对结果调用await会导致此方法在执行时暂停,控制返回调用者(也会获得Task个对象),并且此方法将在{{{{{ 1}}完成。