2012-11-15 24 views
1

我有方法,看起來像這樣:如何解決查詢中的NotMapped屬性?

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秒,而第一個版本在一秒內提供結果。)

有沒有辦法優化第二種方法?或者有沒有辦法讓第一種方法工作?

+0

,因爲它會帶來你的組織到內存中,而不是讓你的數據庫處理查詢第二種方法將需要更長的時間。過去我也遇到過這個問題,恐怕我還沒有找到解決方案。 – jtiger

回答

0

另一種選擇是將數值加載回匿名類型,並通過加載視圖模型的循環加載(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 
}); 

很抱歉的格式;我正在打電話。

+0

這並沒有改變任何東西。在.Select中具有兩個額外的非映射屬性的行爲是導致錯誤的原因,而不是視圖模型。我嘗試了你所說的話,確實引起了例外。 –

0

在循環的每次迭代中,基本上都是懶加載每個對象,導致n + 1個查詢。

你應該做的是把整個集合帶入內存中,並從那裏使用它。

示例代碼:

var organizationList = db.Organizations.Load(); 
foreach (var org in organizationList.Local) 
    { 
     //Here you are free to do whatever you want 
    }