Retrieve an object from entityframework without ONE field

后端 未结 8 2310
[愿得一人]
[愿得一人] 2020-11-30 02:54

I\'m using entity framework to connect with the database. I\'ve one little problem:

I\'ve one table which have one varbinary(MAX) column(with filestream).

I\

8条回答
  •  一整个雨季
    2020-11-30 03:24

    I had this requirement because I have a Document entity which has a Content field with the content of the file, i.e. some 100MB in size, and I have a Search function that I wanted to return the rest of the columns.

    I chose to use projection:

    IQueryable results = dbContext.Documents.Include(o => o.UploadedBy).Select(o => new {
        Content = (string)null,
        ContentType = o.ContentType,
        DocumentTypeId = o.DocumentTypeId,
        FileName = o.FileName,
        Id = o.Id,
        // etc. even with related entities here like:
        UploadedBy = o.UploadedBy
    });
    

    Then my WebApi controller passes this results object to a common Pagination function, which applies a .Skip, .Take and a .ToList.

    This means that when the query gets executed, it doesn't access the Content column, so the 100MB data is not being touched, and the query is as fast as you'd want/expect it to be.

    Next, I cast it back to my DTO class, which in this case is pretty much exactly the same as the entity class, so this might not be a step you need to implement, but it's follows my typical WebApi coding pattern, so:

    var dtos = paginated.Select(o => new DocumentDTO
    {
        Content = o.Content,
        ContentType = o.ContentType,
        DocumentTypeId = o.DocumentTypeId,
        FileName = o.FileName,
        Id = o.Id,
        UploadedBy = o.UploadedBy == null ? null : ModelFactory.Create(o.UploadedBy)
    });
    

    Then I return the DTO list:

    return Ok(dtos);
    

    So it uses projection, which might not fit the original poster's requirements, but if you're using DTO classes, you're converting anyway. You could just as easily do the following to return them as your actual entities:

    var dtos = paginated.Select(o => new Document
    {
        Content = o.Content,
        ContentType = o.ContentType,
        DocumentTypeId = o.DocumentTypeId,
        //...
    

    Just a few extra steps but this is working nicely for me.

提交回复
热议问题