有人可以向我解释为什么我会为此收到设计/编译时错误。
我试图根据最后更新日期或创建日期获取每个表的最后一个 Guid。
var accountId = context.Account.OrderBy(x => x.LastUpdateDate).ThenBy(x=>x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var transactionLineId = context.TransactionLine.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.Transaction.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var transactionId = context.Transaction.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var budgetId = context.Budget.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var scheduleId = context.Schedule.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
Run Code Online (Sandbox Code Playgroud)
然后,等待每个响应并传递给一个方法。
var guids = new List<Guid> { await accountId, await transactionLineId, await transactionId, await budgetId, await scheduleId };
var checkGuid = MungeTwoGuids(guids);
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
CS1061“Task”不包含“ExternalId”的定义,并且找不到接受“Task”类型的第一个参数的可访问扩展方法“ExternalId”(您是否缺少 using 指令或程序集引用?)
这发生在第一行。我以为我可以调用所有这些选择......一次,基本上......然后等待所有响应。而不是呼叫,等待,呼叫,等待......
这不是实现我想要做的事情的正确方法吗?好吧,不是,因为我有错误,但是我对 await 的理解是否走错了路?
然后我从选择中删除了该字段,并尝试像这样获得它,但是......不。
await accountId.Result.ExternalId,
Run Code Online (Sandbox Code Playgroud)
您FirstOrDefaultAsync返回的是 a Task<T>,而不是T它本身,因此没有ExternalId。
通常你会有 2 个选择:
ExternalId在 a 中选择前期Select并稍后等待任务,或Task<T>一个,结果将是T,包含您的财产,以便您可以访问它。但是,正如@GSerg 所指出的:第一个选项不适用,因为执行 parralell 查询将导致并发异常。
所以,你的情况是有意义的等待FirstOrDefaultAsync直接,使用Select,??或空检查,以克服可能的空REF例外。
尽量避免 ,accountId.Result.ExternalId因为它会使您的代码同步运行,并且您将失去异步调用的好处。请参阅:
await Task<T> 和 Task<T>.Result 之间有什么区别?