我最近開始在.Net Web應用程序中使用EF和MVC,並且遇到了一個問題,並且想知道您的想法是什麼以及是否你將能夠指向正確的方向。一對多使用ICollection與實體框架,以及如何提高性能
所以,我有兩個類:DataGroup和DataElements。 DataElement可以在一個DataGroup中,也可以不在一個DataGroup中。我用流利的API中的DataContext來實現這一點:
modelBuilder.Entity<DataGroup>()
.HasMany(dg => dg.DataElements)
.WithOptional()
.HasForeignKey(de => de.DataGroup_Id);
在我DATAGROUP類我有以下幾點:
public virtual ICollection<DataElement> DataElements { get; set; }
[NotMapped]
public ICollection<DataElement> RecentDataElements //returns the last 15 data elements
{
get
{
return DataElements.OrderByDescending(de => de.GeneratedDateTime).Take(15).Reverse().ToList();
}
}
[NotMapped]
public DataElement LatestDataElement //returns the latest data element (if any)
{
return DataElements.OrderByDescending(de => de.GeneratedDateTime).FirstOrDefault();
}
所以我有上面的代碼的問題是,當我打電話LatestDataElement或RecentDataElements,我最終等了很多。
我相信這是因爲DataGroup類中的DataElements屬性是ICollection,RecentDataElements和LatestDataElement最終導致EF在排序和返回子集之前將所有DataElement加載到內存中(可能有數千個DataElements一個DataGroup)。
有沒有辦法讓這個更高效?
我玩過了直接查詢datacontext的想法,而不是使用DataElements屬性,但我想看看是否有其他選項我應該考慮。有同事告訴我,把數據上下文放在模型中是不好的做法(不管它們是對還是錯都是不同的問題)。
感謝您的幫助和建議。非常感謝:)