Как преобразовать вызов хранилища Ienumerable в проект бритвенных страниц для асинхронного запуска - PullRequest
0 голосов
/ 25 марта 2020

У меня есть модель, называемая заметками, которую я подаю в сетку кендо через вызовы интерфейса / класса репозитория. Все работает, но работает синхронно, и я хочу запустить его асинхронно. Я использую. NET core 3.1, поэтому все IAsyncEnumerable et c должны быть доступны, если я смогу решить, как это сделать. Я перепробовал много вариантов, но всегда получаю ошибки. Любая помощь очень ценится.

Это интерфейс

namespace FliveRetry.Models.PTs
{
    public  interface IPtNoteRepository
    {       
        IEnumerable<Note> GetAllNotes();

        Note GetNoteById(int NoteId);

    }
}

Это хранилище


namespace FliveRetry.Models.PTs
{
    public class PtNoteRepository : IPtNoteRepository
    {
        private readonly FliveRetryContext context;

        public PtNoteRepository(FliveRetryContext context)
        {
            this.context = context ?? throw new ArgumentNullException(nameof(context));
        }

        public IEnumerable<Note> GetAllNotes()
        {
            return context.Note;
        }

        public Note GetNoteById(int itemId)
        {
            var note = context.Note.SingleOrDefault(i => i.ID == itemId);
            return note;
        }

    }
}

, и это модель индекса, где я его называю и подача его в сетку через OnPostRead


namespace FliveRetry.Pages.Notes
{
    public class IndexModel : NoteSelectPageModel
    {
        private const int CURRENT_USER_ID = 21; //Fake user id for demo

        private readonly IPtNoteRepository rpsNotesRepo;
        public static IList<Note> Notes { get; set; }

        [BindProperty(SupportsGet = true)]
        public NoteScreenEnum? PresetScreen { get; set; }

        public IndexModel(IPtNoteRepository rpsNotesData)
        {
            rpsNotesRepo = rpsNotesData;
        }

        public void OnGet()
        {           
            IEnumerable<Note> notes;
            switch (PresetScreen)
            {
                case NoteScreenEnum.GeneralNotes:
                    notes = rpsNotesRepo.GetAllNotes();
                    break;
                case NoteScreenEnum.ThisNote:
                    notes = rpsNotesRepo.GetNoteByID(CURRENT_USER_ID);
                    break;              
                default:
                    notes = rpsNotesRepo.GetAllNotes();
                    break;
            }
            Notes = notes.ToList();
        }

        public JsonResult OnPostRead([DataSourceRequest] DataSourceRequest request)
        {           
            return new JsonResult(Notes.ToDataSourceResult(request));
        }
    }
}

На других страницах, таких как create или edit.cs html .cs, например, я успешно использую asyn c для редактирования и создания, например:


namespace FliveRetry.Pages.Notes
{
    public class EditModel : NoteSelectPageModel
    {
        private readonly FliveRetry.Data.FliveRetryContext _context;


        public EditModel(FliveRetry.Data.FliveRetryContext context)
        {
            _context = context;
        }

        [BindProperty]
        public Note Note { get; set; }

        public async Task<IActionResult> OnGetAsync(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            Note = await _context.Note
                .AsNoTracking()
                .FirstOrDefaultAsync(m => m.ID == id);

            if (Note == null)
            {
                return NotFound();
            }
            return Page();
        }

        public async Task<IActionResult> OnPostAsync(IFormCollection form, int? id, string[] selectedOrgs, string[] selectedClients, string[] selectedStaffs, string[] selectedNoteTypes)
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            var noteToUpdate = await _context.Note              
                .FirstOrDefaultAsync(s => s.ID == id);
            if (await TryUpdateModelAsync<Note>(noteToUpdate, "note",   // Prefix for form value.
                   c => c.Title, c => c.NoteText, c => c.NoteDate, c => c.Amount, c => c.ImageURL, c => c.FileURL, c => c.Archived, c => c.DateSaved, c => c.UserID, c => c.StartTime, c => c.FinishTime))
            {               
                await _context.SaveChangesAsync();              
                return RedirectToPage("./Index");
            }
            return Page();
        }

    }
}

1 Ответ

2 голосов
/ 26 марта 2020

Попробуйте использовать приведенный ниже код для преобразования синхронного действия в асинхронное действие:

IPtNoteRepository:

public  interface IPtNoteRepository
{       
    Task<IEnumerable<Note>> GetAllNotesAsync();
    Task<Note> GetNoteByIdAsync(int NoteId);
}

Репозиторий:

public class PtNoteRepository : IPtNoteRepository
{
    private readonly FliveRetryContext context;

    public PtNoteRepository(FliveRetryContext context)
    {
        this.context = context ?? throw new ArgumentNullException(nameof(context));
    }

    public async Task<IEnumerable<Note>> GetAllNotesAsync()       
    {
        return await context.Note.ToListAsync();
    }

    public async Task<Note> GetNoteByIdAsync(int itemId)
    {
        var note = await context.Note.SingleOrDefaultAsync(i => i.ID == itemId);
        return note;
    }

}

IndexModel:

public async Task OnGetAsync()
    {           
        IEnumerable<Note> notes;
        switch (PresetScreen)
        {
            case NoteScreenEnum.GeneralNotes:
                notes = await rpsNotesRepo.GetAllNotesAsync();
                break;
            case NoteScreenEnum.ThisNote:
                notes = await rpsNotesRepo.GetNoteByIdAsync(CURRENT_USER_ID);
                break;              
            default:
                notes = await rpsNotesRepo.GetAllNotesAsync();
                break;
        }
        Notes = notes.ToList();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...