我试图在从父实体开始对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;
}
答案 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
分解为所需的特定属性,并更详细地了解请求,但是我不知道您到底需要什么才能提供更多具体的例子。