Исключение InvalidOperationException: Выражение LINQ не удалось перевести

#c# #linq #entity-framework-core

Вопрос:

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

Код:

 public class DownloadsModel : PageModel
{ 
    [BindProperty(SupportsGet = true)]
    public int Id { get; set; }
    [BindProperty(SupportsGet = true)]
    public string FileType { get; set; }
    private readonly IDbContextFactory<ApplicationDbContext> _dbFactory;

    public DownloadsModel(IDbContextFactory<ApplicationDbContext> dbFactory)
    {
        _dbFactory = dbFactory;
    }

    public async Task<IActionResult> OnGet()
    {           
        var context = _dbFactory.CreateDbContext();            
        
        var file = await context.FileUploads.Select(x => new FileUploadModel
        {
            FileName = x.FileName,
            FileContent = x.FileContent
        }).SingleAsync(x => x.Id == Id);                                

        return File(file.FileContent, FilesConst.DownloadsConst.ApplicationForceDownload, file.FileName);
    }
}
 

Исключение:

введите описание изображения здесь

Может ли кто-нибудь помочь мне понять первопричину этой проблемы?

С уважением

Ответ №1:

Запрос в написанном виде пытается отфильтровать результаты после проекции. Кроме того, для проецируемого типа (FileUploadModel) не заполнено поле Id, поэтому оно всегда будет значением по умолчанию (0, если это int). Если вы сначала отфильтруете, а затем проецируете, это должно сработать.

 var file = await context.FileUploads
    .Where(x => x.Id == Id)
    .Select(x => new FileUploadModel
    {
        FileName = x.FileName,
        FileContent = x.FileContent
    })
    .SingleAsync();
 

Комментарии:

1. Спасибо, это сработало, я почему-то думал, что заказ не будет иметь значения