2012-05-30 45 views
3

我試圖檢索存儲爲List的Property entitiy的所有記錄。 這個實體擁有照片集合,這個集合最多可以填充5個圖像。只從集合中獲取第一個元素

爲了減少加載時間,我想檢索屬性列表,並在每個屬性中只收集來自集合的第一張照片。 由於此查詢

List<Domain.Property> data = session.Query<Domain.Property>() 
         .Fetch(x => x.Photos.First()) 
         .ToList(); 

給我這個錯誤。獲取請求必須是一個簡單的成員訪問表達式; '[100002]'是一個SubQueryExpression。參數名稱:relatedObjectSelector。

於是我就用

List<Domain.Property> data = session.Query<Domain.Property>() 
         .ToList(); 

我試着在列表和foreach循環來檢索屬性來訪問每個屬性和加載內nhib照片對象。這樣的會話

var a = PropertyViewModel.FromDomainModel(data, session); 

public static List<PropertyViewModel> FromDomainModel(IList<Property> x, ISession session) 
     { 
      List<PropertyViewModel> dataVm = new List<PropertyViewModel>(); 

      foreach (Property p in x) 
      { 
       Photo firstPhoto = session.Get<Photo>(p.Photos[0].Id); 

       dataVm.Add(new PropertyViewModel(p, firstPhoto)); 
      } 
      return dataVm; 
     } 

public PropertyViewModel(Property x, Photo y) 
     { 
      Id = x.Id; 
      ... 
      Photo = new Photo(); 
      Photo = y; 
     } 

這種方法甚至看起來很好(至少對我來說:))它根據nhib加載。探查器65個實體(其中照片標識符是46個負載,以及屬性19標識符)。 (它應該爲每個屬性加載19個屬性標識和19個照片標識第一個圖像)。

我應該在這裏做什麼錯?

我不熟悉預測,所以它應該是最後的解決方案。

感謝

+0

你可以嘗試'session.Query ()獲取(X => x.Photos)。首先()ToList()' – GregRos

+0

#Greg無論如何,羅斯不會工作,謝謝。 – BobRock

回答

1

我不認爲你可以做到這一點沒有突起的(.Select())調用。

您使用foreach時加載了很多照片的原因是因爲您正在訪問一個帶有p.Photos[0]的Photos集合,這會觸發NHibernate對集合的Lazy Loading。從數據庫中加載所有照片,然後使用索引器[0]選擇第一張。

即使您使用LINQ的.First()方法代替索引器,也可能會觸發延遲加載,因爲您不是在IQueryable實例上調用它,而是在動態代理對象上調用它。

+0

Hvala Miroslave :) – BobRock

+0

Nema načemu... Pozdravi Broja 1 :) –

0

如果你有Domain.Photo和Domain.Property之間的關係,那麼它會更容易做照片上的查詢和加載該屬性,像這樣(我沒有測試過,如果這個編譯,但它應該給你的總體思路):

var subQuery = QueryOver.Of<Domain.Property>().Select(x => x.Min(y => y.Photos)); 
List<Domain.Photo> data = session.QueryOver<Domain.Photo>() 
    .WhereRestrictionOn(x => x.Id).IsIn(subQuery) 
    .Fetch(x => x.Property).Eager 
    .List(); 
相關問題