[英]c# Entity Framework select into derived child
所以我需要选择一个Task()
对象,它是Attachments()
对象,并Include()
,如下所示:
var tmp = cntx.Tasks.Include( at => at.Attachments ).FirstOrDefault(t => t.Id == id );
它工作正常,MVC api控制器可以将其序列化为json,列出了所有的Attachmnets,基本上它的运行非常好。
现在我的问题是,我在Task()
需要3个附加的字符串属性(为清楚起见,我仅在下面使用+1字符串Task()
public class TaskView : DataClasses.Task {
public string BusinessName { get; set; }
}
这些道具不是Task()
导航属性,实际上是来自其他一些表。 现在,我可以将上一个查询与表连接起来,但是我不确定如何选择前一个完全填充的Task对象及其所有导航Attachment()
对象,然后将其转换为TaskView obj,并添加BusinessName串。
有什么想法吗?
public class TaskView : DataClasses.Task {
public string BusinessName { get; set; }
// Create constructor for Task
public TaskView(DataClasses.Task task)
{
// Copy properties here
}
}
然后,您可以执行以下操作:
var tmp = cntx.Tasks
.Include(at => at.Attachments)
.Where(t => t.Id == id)
.Select(t=> new TaskView(t) { BusinessName=...})
.FirstOrDefault();
或者,您可以在TaskView上创建一个属性,该属性可以从TaskView设置(并可能)获得Task,然后只需在LINQ查询中进行设置即可。
或这样做:
public class TaskView {
public string BusinessName { get; set; }
public DataClasses.Task Task { get; set;}
}
然后:
var tmp = cntx.Tasks
.Include(at => at.Attachments)
.Where(t => t.Id == id)
.Select(t=> new TaskView { Task=t,BusinessName=...})
.FirstOrDefault();
基类实例不能“投射”到派生类实例。 您需要创建一个新的TaskView
实例,并复制源Task
所有属性。
如果您负担得起,最好改用收容而不是像这样的继承
public class TaskView
{
public Task Task { get; set; }
public string BusinessName { get; set; }
// ...
}
不要将实体与传输层及其视图混淆。 如果再为传输层创建两个以上的类,则是更好的解决方案:
public class TaskDto
{
public long Id {get; set;}
public List<AttachmentsDto> Attachments {get; set;}
}
public class AttachmentsDto
{
public long Id {get; set;}
}
还有两个像以前一样没有继承的视图。 此外,您还需要创建一些帮助程序类,以将实体映射到dto以及从dto映射到视图。
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()
});
如果我正确理解您的问题,请尝试使用选择查询。
就像是:
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"
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.