C#实体框架:选择后获取孩子的父母

时间:2019-04-09 16:49:18

标签: c# entity-framework-6

我试图在从父实体开始对EF进行查询之后,在对象上同时保留对父对象的引用,同时对父和子对象进行过滤并返回子对象。但是我返回的那些孩子记录需要保持对父记录的引用。

在下面的示例中,父级在执行“选择”之前一直可用,然后返回子级...但是丢失了对父级的引用“返回”。我怎么不能松开父母的那个对象???

所以我需要的是Table2Model的返回结果仍然在MODEL中保持引用返回给父对象。但是在select语句之后,该引用丢失了。

如果我添加此

result.ForEach((t2) =>
  {
    t2.Table1 = db.Table1Model.SingleOrDefault(t1 => t1.Table1Id == t2.Table1Id);
  });

它解决了我的问题...但是我想知道是否有某种方法可以将父引用保留在原始调用中。分两步执行此操作会使查询的工作量加倍。

(下面的db是数据库上下文)

public class Table1Model {
    public Table1Id {get; set;}
    public Name {get; set;}
    public Desc {get; set;}
    public virtual ICollection<Table2Model> Table2Models {get; set;}
}

public class Table2Model {
    public Table2ModelId {get; set;}
    public SpecialData1 {get; set;}
    public SpecialData2 {get; set;}
    public SpecialData3 {get; set;}
    public Table1Id {get; set;}
    public virtual Table1Model Table1 {get; set;}
}

public class List<Table2Model> DoWork(sampleRequest request){

    var result = db.Table1Model
        .Where(t => t.Name = request.Name)
        .Select(t => t.Table2Models.OrderByDescending(n => n.Table2ModelId).FirstOrDefault())
        .OrderBy(t2 => t2.SpecialData1)
        .Take(5)
        .ToList();

    return result;
}

1 个答案:

答案 0 :(得分:0)

也许我在这里遗漏了一些东西,但是为什么不将其投影到另一个模型中并包括这两个部分。

public class TheModel
{
    public Table1Model Table1Model { get; set; }
    public Table2Model Table2Model { get; set; }
}

var result = db.Table1Model
    .Where(t => t.Name = request.Name)
    .Select(t => new TheModel {
        Table1Model = t,
        Table2Model = t.Table2Models
            .OrderByDescending(n => n.Table2ModelId)
            .FirstOrDefault())
    .OrderBy(t2 => t2.Table2Model.SpecialData1)
    .Take(5)
    .ToList();

我实际上建议您将TheModel分解为所需的特定属性,并更详细地了解请求,但是我不知道您到底需要什么才能提供更多具体的例子。