[英]How to work around NotMapped properties in queries?
我有這樣的方法:
private static IEnumerable<OrganizationViewModel> GetOrganizations()
{
var db = new GroveDbContext();
var results = db.Organizations.Select(org => new OrganizationViewModel
{
Id = org.OrgID,
Name = org.OrgName,
SiteCount = org.Sites.Count(),
DbSecureFileCount = 0,
DbFileCount = 0
});
return results;
}
這是相當迅速的返回結果。
但是,您會注意到OrganizationViewModel必須具有設置為“ 0”的屬性。 我通過部分類添加的組織模型中有一些屬性,並用[NotMapped]裝飾:UnsecureFileCount和SecureFileCount。
如果我將這些0更改為有用的內容...
DbSecureFileCount = org.SecureFileCount,
DbFileCount = org.UnsecureFileCount
...我收到“僅支持初始化程序,實體成員和實體導航屬性”的異常。 我覺得這有點令人困惑,因為我沒有在詢問數據庫有關它們的信息,而只是設置視圖模型的屬性。
但是,由於EF沒有聽我的觀點,所以我嘗試了另一種方法:
private static IEnumerable<OrganizationViewModel> GetOrganizations()
{
var db = new GroveDbContext();
var results = new List<OrganizationViewModel>();
foreach (var org in db.Organizations)
{
results.Add(new OrganizationViewModel
{
Id = org.OrgID,
Name = org.OrgName,
DbSecureFileCount = org.SecureFileCount,
DbFileCount = org.UnsecureFileCount,
SiteCount = org.Sites.Count()
});
}
return results;
}
從技術上講,這毫無例外地為我提供了正確的結果,但這需要永遠。 (我所說的“永遠”是指超過60秒,而第一個版本在不到一秒鍾的時間內提供了結果。)
有沒有一種方法可以優化第二種方法? 還是有辦法讓第一種方法起作用?
另一種選擇是將值作為匿名類型加載回去,並循環遍歷這些值以加載您的視圖模型(n + 1很可能是速度慢的原因)。
例如:
var results = db.Organizations.Select(org => new
{
Id = org.OrgID,
Name = org.OrgName,
DbSecureFileCount = org.SecureFileCount,
DbFileCount = org.UnsecureFileCount,
SiteCount = org.Sites.Count()
}).ToList();
var viewmodels = results.Select( x=> new OrganizationViewModel
{
Id = x.Id,
Name = x.Name,
DbSecureFileCount = x.DbSecureFileCount,
DbFileCount = x.DbFileCount,
SiteCount = x.SiteCount
});
抱歉,格式化; 我在電話上打字。
您基本上是在循環的每次迭代中懶惰地加載每個對象,從而導致n + 1個查詢。
您應該做的是將整個集合帶入內存,然后從那里使用它。
樣例代碼:
var organizationList = db.Organizations.Load();
foreach (var org in organizationList.Local)
{
//Here you are free to do whatever you want
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.