skip to Main Content

I have two different classes:

The following is a model for the database table named "Attachments":

namespace WebApi.Models
{
    public class Attachment
    {
        public enum EntityType
        {
            Transaction
        }
        public int AttachmentId { get; set; }
        public int EntityId { get; set; }
        public EntityType Type { get; set; }
        public string Filename { get; set; }
        public DateTime Created { get; set; }
        public DateTime Updated { get; set; }
    }
}

and in my dbContext class I have something like the following:

namespace WebApi.Models
{
    public class accountingContext : DbContext
    {
        public DbSet<User>? Users { get; set; }
        public DbSet<Transaction>? Transactions { get; set; }
        public DbSet<Attachment>? Attachments { get; set; }

        ///...
    }
}

and then I have a similar cvlass to the Attachement model which is usedf to send data back in response to a web api request, the class is below:

namespace WebApi.Entities.AttachmentResponse;

public class AttachmentResponse
{
    public int AttachmentId { get; set }
    public string Filename { get; set; }
}

I wish to keep my class for responses seperate rather then using the model classes for reasons I don’t feel worthwhile going into.

After performing a query against the model classes I need to convert the result and map to the AttachmentResponse class. I am trying the following:

List<WebApi.Entities.AttachmentResponse> attachments = (
    from a in db.Attachments
    from t in db.Transactions.Where(t => a.EntityId == t.TransactionId && t.UserId == userId)
    where a.EntityId == EntityId
    select new
    {
        a.AttachmentId,
        a.Filename
    }).ToList();

But I get an error with the above attempt. I have also looked at ConvertAll but cannot see how to use it in the code above.

Is it possible to accomplish what I am attempting? If so, where am I going wrong above?

2

Answers


  1. You’re creating a list of an anonymous type, not a list of AttachmentResponse objects. You need to explicitly create them in the projection:

    select new AttachmentResponse
    {
        AttachmentId = a.AttachmentId,
        Filename = a.Filename
    }
    

    I would also look at tools like AutoMapper that can create mappings very easily, especially when the property names are the same.

    Login or Signup to reply.
  2. I can’t comment, so I can’t ask what error you’re getting. However, from looking at it, it looks like a casting problem. You can cast anonymous types to other types. Using just new makes is anonymous instead specify they type that you are declaring new.

    List<WebApi.Entities.AttachmentResponse> attachments = (
        from a in db.Attachments
        from t in db.Transactions.Where(t => a.EntityId == t.TransactionId && t.UserId == userId)
        where a.EntityId == EntityId
        select new WebApi.Entities.AttachmentResponse
        {
            a.AttachmentId,
            a.Filename
        }).ToList();
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search