linq查询中的异步任务方法问 题在c#中返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linq查询中的异步任务方法问 题在c#中返回相关的知识,希望对你有一定的参考价值。

我需要帮助处理异步任务我试图返回来自数据库的值列表,我有一个表存储库,然后使用该类的irepository,我遇到的问题是在我的方法中使用我的异步任务返回值列表。

这是我的代码,我的问题是如何正确使用异步任务,然后在方法中返回我的linq查询,因为我得到一个错误GetMaterialLookupCodeQuery()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BarcodeReceivingApp.Core.Repositories;
using System.Data.Entity;

namespace BarcodeReceivingApp.Persistence.Repositories
{
    public class MaterialRepository : Repository<Material>, IMaterialRepository
    {
        public MaterialRepository(BarcodeReceivingDbContext context)
            : base(context)
        {

        }
        public async Task<IEnumerable<string>> GetMaterialLookupCodeQuery()
        {
            return await BarcodeReceivingDbContext.Materials.Include(m => m.MaterialLookupCode).Select(m => m.MaterialLookupCode);
        }

        public BarcodeReceivingDbContext BarcodeReceivingDbContext
        {
            get { return Context as BarcodeReceivingDbContext; }
        }
    }
}

这是该类的接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BarcodeReceivingApp.Core.Repositories
{
    public interface IMaterialRepository : IRepository<Material>
    {
        Task<IEnumerable<string>> GetMaterialLookupCodeQuery();
    }
}
答案

Linq使用关键字yield return,这表示在调用之前我们不会实际执行操作。所以你的避免代码试图等待懒惰调用方法的操作。

根据这个MSDN

Although it's less code, take care when mixing LINQ with asynchronous code. Because LINQ uses deferred (lazy) execution, async calls won't happen immediately as they do in a foreach() loop unless you force the generated sequence to iterate with a call to .ToList() or .ToArray().

所以,失去了等待。在使用结果之前,您实际上并未执行该语句

以上是关于linq查询中的异步任务方法问 题在c#中返回的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的GetEnumerator方法,C# DataTable几个常用的查询表达式,C#的lINQ怎么用干啥用的

C#8.0: 在 LINQ 中支持异步的 IAsyncEnumerable

LINQ to SQL查询中的C#Dynamic WHERE子句

c# 在 LINQ 查询返回的列表中查找项目并将其值与列表中的另一个项目进行比较

NodeJS Express 异步/等待

这个异步任务方法有啥问题?