Ошибка метода асинхронной задачи при возврате запроса linq в c # - PullRequest
0 голосов
/ 19 февраля 2019

Мне нужна помощь здесь с асинхронными задачами. Я пытаюсь вернуть список значений, поступающих из базы данных, и у меня есть хранилище таблиц, а затем использую репозиторий этого класса, проблема, с которой я сталкиваюсь, заключается в использовании моей асинхронной задачи в моемметод для возврата списка значений.

Вот мой код, моя проблема здесь заключается в том, как правильно использовать асинхронные задачи, а затем ожидать возвращения в моем запросе 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();
    }
}

1 Ответ

0 голосов
/ 25 февраля 2019

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().

Итак, потерять ожидание.Вы на самом деле не выполняете оператор, пока не будете использованы результаты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...