繁体   English   中英

c#实体框架选择到派生子级

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM