2017-09-04 42 views
0

我有3个实体简单的代码,第一个模型(从数据库中生成):实体框架SQL不是最优的导航属性

[Table("Note")] 
public partial class Note 
{ 
    public Note() 
    { 
     NoteCompanies = new HashSet<NoteCompany>(); 
    } 

    public long ID { get; set; } 

    [Column(TypeName = "text")] 
    public string Content { get; set; } 

    public DateTime Date { get; set; } 

    public virtual ICollection<NoteCompany> NoteCompanies { get; set; } 

} 

[Table("Company")] 
public partial class Company 
{ 
    public long ID { get; set; } 

    [StringLength(150)] 
    public string Name { get; set; } 

} 

[Table("NoteCompany")] 
public partial class NoteCompany 
{ 
    public long ID { get; set; } 

    public long NoteID { get; set; } 

    public long CompanyID { get; set; } 

    public virtual Company Company { get; set; } 

} 

当我使用这个模型里面ASP MVC视图,如:

@model Models.Note 

<ul> 
@for (var company in Model.NoteCompanies.Select(nc => nc.Company)) 
{ 
    <a href="#">@company.Name</a> 
} 
</ul> 

实体框架激发每个公司的单一选择查询。我预计实体将使用产生JOIN查询,如:

SELECT {fields} 
FROM 
    NoteCompany NC 
    INNER JOIN Company C ON NC.CompanyId = C.Id 
WHERE 
    NC.NoteId = @Param 

是否有可能迫使EF产生JOIN查询,而不是单列SELECT

问候 IT人

回答

0

这将是最好写的东西是这样的:

@{ 
    var ids = Model.NoteCompanies.Select(nc => nc.CompanyID).ToList(); 
    for (var company in db.Companies.Where(x => ids.Contains(x.ID)).ToList()) 
    { 
     <a href="#">@company.Name</a> 
    } 
} 

或者试图获得NoteCompanies通过eager loading在控制器相应Companies

model.NoteCompanies = db.NoteCompanies.Include(x => x.Company).ToList(); 
return View(model); 
+0

谢谢,工作!是否有可能在实体级别上实现此行为(注)?我想拥有一个将通过单个查询运行返回相关公司的资产。 –

+0

我认为上面只显示了唯一的方法,其他任何东西都是关于这些的。 –