Reputation: 740
So I need to select a Task()
object, with it's Attachments()
objects, with Include()
, like this:
var tmp = cntx.Tasks.Include( at => at.Attachments ).FirstOrDefault(t => t.Id == id );
It's working fine, MVC api controller can serialize it to a json, with all of it's Attachmnets listed, basically it's working wonderfully.
Now my problem is, that i need 3 additional string property (for clearer example, I only use +1 string below) in the Task()
public class TaskView : DataClasses.Task {
public string BusinessName { get; set; }
}
And those props are not navigational properties for Task()
, in fact it's from a few other tables. Now I can join up the previous query, with the tables, but I'm not sure how to select the previous fully populated Task object, with all of it's navigational Attachment()
objects, and cast it to TaskView obj, with the added BusinessName string.
Any thoughts?
Upvotes: 1
Views: 1896
Reputation: 21487
public class TaskView : DataClasses.Task {
public string BusinessName { get; set; }
// Create constructor for Task
public TaskView(DataClasses.Task task)
{
// Copy properties here
}
}
Then you can do this:
var tmp = cntx.Tasks
.Include(at => at.Attachments)
.Where(t => t.Id == id)
.Select(t=> new TaskView(t) { BusinessName=...})
.FirstOrDefault();
Or you can create a property on TaskView that sets (and possibly get) a Task from TaskView, and just set it in the LINQ query.
Or do this:
public class TaskView {
public string BusinessName { get; set; }
public DataClasses.Task Task { get; set;}
}
Then:
var tmp = cntx.Tasks
.Include(at => at.Attachments)
.Where(t => t.Id == id)
.Select(t=> new TaskView { Task=t,BusinessName=...})
.FirstOrDefault();
Upvotes: 2
Reputation: 1333
Don't confuse entities with transport layer and their view. Better solution if you create two more classes for transport layer like this:
public class TaskDto
{
public long Id {get; set;}
public List<AttachmentsDto> Attachments {get; set;}
}
public class AttachmentsDto
{
public long Id {get; set;}
}
And two more for view without inheritance like previous. Also you need to create some helper classes for mapping entity to dto and from dto to view.
var dtos = cntx.Tasks.Include( at => at.Attachments ).FirstOrDefault(t => t.Id == id ).Select(x => new TaskDto
{
Id = x.Id,
Attachments = x.Attachments.Select(y => new AttachmentsDto { Id = y.Id }).ToList()
});
Upvotes: 1
Reputation: 2913
Try it with select query, if I understand your question correctly.
Something like:
var tmp = from o in cntx.Tasks.Include( at => at.Attachments )
were (o.id == id)
select new TaskView()
{
//Properties here
//e.g
Id = o.Id,
Attachments = o.Attachments,
BusinessName = "YourBusinessName"
};
Upvotes: 0
Reputation: 205579
A base class instance cannot be "cast" to a derived class instance. You need to create a new TaskView
instance and copy all the properties of the source Task
.
If you can afford, it would be much better to switch to containment rather than inheritance like this
public class TaskView
{
public Task Task { get; set; }
public string BusinessName { get; set; }
// ...
}
Upvotes: 1