簡體   English   中英

如何解決查詢中的NotMapped屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM