【发布时间】:2015-09-15 15:29:49
【问题描述】:
我有以下实体
//Active Auction Entity
public class ActiveAuction
{
public int Id { get; set; }
public string Title { get; set; }
public int? FirstAuctionId { get; set; }
public int? SecondAuctionId { get; set; }
public int? ThirdAuctionId { get; set; }
public virtual Auction FirstAuction { get; set; }
public virtual Auction SecondAuction { get; set; }
public virtual Auction ThirdAuction { get; set; }
}
// Auction Entity
public class Auction
{
public int AuctionId { get; set; }
public AuctionStatus AuctionStatus { get; set; }
public int? DepartmentId { get; set; }
public virtual Department Department { get; set; }
}
// Department Entity
public class Department
{
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
public int? AdminId { get; set; }
public virtual Admin Admin { get; set; }
}
我要做的是让Active Auctions 加载Auctions 并且Auction 也加载Departments
我知道我应该为每个要加载的对象写Include,这样EF生成的SQL就会有join语句来为我选择对象
但这是现有的代码
using (var dc = DataContext())
{
await dc.Auction
.Include("Department.Admin")
.Where(i => i.Id == id && i.AuctionStatus == AuctionStatus.Accepted).ToListAsync();
return await dc.ActiveAuction.
SingleOrDefaultAsync(i => i.Id == id);
}
我不知道这段代码是如何工作的,返回的 ActiveAuctions 包含所有需要的对象
我检查了针对数据库执行的 SQL,并按预期生成了单独的查询。
我想要一个解释来了解返回的ActiveAcutions 是如何与其他提到的实体一起加载的!!?
【问题讨论】:
-
Categories.Admin是Department.Admin的错字吗?或者您是否从Auction对象中删除了Categories以缩短代码? -
它应该是 Department.Admin 我修正了,Admin 也是另一个现有实体
-
很好,考虑使用强类型包含(即
.Include(a => a.Department.Admin)。它将避免拼写错误/包含不存在的对象。 -
回答您的问题,我相信这是因为您在相同的上下文中执行了这两个查询。 EF 然后意识到主键匹配,然后链接您的数据。
-
我想过在内存中发生了某种合并,但是我找不到任何关于这个的文章
标签: c# entity-framework linq join