2015-05-14 164 views
0

所以,這裏的情況的簡化版本: 我有一個數據庫體育館:通過對象的另一列表VB.NET LINQ排序對象的列表

Gym: GymID, Name 
GymAmenities: GymID, AmenityID 
Amenities: AmenityID 

因此,一個健身房,可以有0〜許多「設施」。走來誰優先設施,對他或重要用戶她:

UserPrefAmenities: UserID, AmenityID, Ranking 

現在在郵政編碼健身房搜索時,我希望搜索結果是用戶首選的設施順序順序秩...

gyms = (From g In db.Gyms Where g.Zip = thisRequest.Zip Order By g.GymAmenitys.Contains(From upa In thisUser.UserPrefAmenitys Order By upa.Rank)).ToList 

或者類似的東西...

*注意,在運行上面的結果:

無法創建類型爲'UserPrefAmenity'的常量值。在此上下文中僅支持 基元類型或枚舉類型。

回答

1

我想這應該這樣做:

gyms = (
     From g In db.Gyms 
     Where g.Zip = thisRequest.Zip 
     Order By If((From ga in g.GymAmenitys 
        Join upa In db.UserPrefAmenitys On ga.AmenityID 
                Equals upa.AmenityID 
        Where upa.UserID = thisUser.UserID 
        Order By upa.Rank Descending 
        Select CType(upa.Rank, integer?)).FirstOrDefault(), 0) 
     ).ToList 

的想法是,你會發現用戶的最高排名UserPrefAmenity共享的Gym的設施的AmenityID。如果用戶沒有匹配UserPrefAmenity,則將0值作爲等級。

+0

如果表達式必須是可空或引用類型,那麼獲取「二進制中的第一個操作數」,並且「==」應該是「=」,對這部分來說是正確的:(From ga In g.GymAmenitys Join upa在db.UserPrefAmenitys on ga.AmenityID Equals(upa.AmenityID)其中upa.UserID = thisUser.UserID _ Order by upa.Rank Descending Select upa.Rank).FirstOrDefault – Jarrette

+0

啊,「==」是我的C#方言閃亮至於例外,Rank的類型是什麼? –

+0

我認爲我修正了這個例外(如果Rank是一個整數) –