作为处理'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次?
谢谢!
答案 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
排除已停用的产品。
因此,您的第二个参数predicate
将m => m.ProductId == id
作为Expression
树,该方法可以转换为SQL并发送到数据库。
最后,返回类型Task<>
表示该方法将被执行asynchronously,您将立即获得一个Task
对象,一旦可用,您可以使用该对象获取实际结果
对结果调用await
会导致此方法在执行时暂停,控制返回调用者(也会获得Task
个对象),并且此方法将在{{{{{ 1}}完成。