次のようなメソッドがあります。
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 秒以上を意味しますが、最初のバージョンでは 1 秒未満で結果が得られます。)
2番目のアプローチを最適化する方法はありますか? または、最初のアプローチを機能させる方法はありますか?