2017-09-04 70 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

我認爲上面只顯示了唯一的方法,其他任何東西都是關於這些的。 –