2011-03-23 42 views
0

這裏是我的表結構如何通過多個ID構建自定義PLINQO查詢?

地方

  • PlaceId PK
  • 名稱
  • ...

PlaceCategories

  • CATID PK
  • 名稱
  • ...

PlaceCats

  • PlaceId PK
  • CATID PK

這裏是我的查詢PU LLS基於類別ID位(表連接)

public static IQueryable<Places> ByPlaceCat(this Table<Places> table, Expression<Func<PlaceCats, bool>> predicate) { 
    var db = (DataContext)table.Context; 
    var innerBizBase = db.PlaceCats.Where(predicate); 
    return db.Places.Join(innerBizBase, a => a.PlaceId, ab => ab.PlaceId, (a, ab) => a); 
} 

我用這樣的:

places = Db.Places.ByPlaceCat(a => a.CatId == 5); 

但我希望能夠基於類別的id的List<int>拉。通過生成的PLINQO碼,即由多個PlaceId的拉查詢展望(但不使用連接表)看起來是這樣的:

public static IQueryable<Places> ByPlaceId(this IQueryable<Places> queryable, IEnumerable<long> values) 
{ 
    return queryable.Where(p => values.Contains(p.PlaceId)); 
} 

我怎麼能實質上合併這兩個查詢,讓我傳遞的List<int> CatId的查詢?這個LINQ/PLINQO查詢正在融化我的大腦。提前致謝!

回答

3

您需要編寫一個擴展方法是這樣的:

public static IQueryable<Places> ByPlaceCats(this Table<Places> table, IEnumerable<int> catIds) 
    { 
     var db = (TestDataContext)table.Context; 
     var places = (from placeCat in db.PlaceCats 
         join place in db.Places on placeCat.PlaceId equals place.PlaceId 
         where catIds.Contains(placeCat.CatId) 
         select place); 
     return places; 
    } 

請注意,PlaceCats表可以通過添加兩個外鍵正確的表被拍成ManyToMany relationship。一旦做出這種更改,PLINQO將自動生成正確的代碼,並在兩張表之間創建一個跳過中間表的鏈接。因此,您可以通過訪問Places實體上的屬性來獲取與當前Places實體關聯的PlaceCategories集合。

如果您有任何疑問,請記住contact us,並務必查看位於herePLINQO forums here的社區論壇。

感謝 -Blake Niemyjski(CodeSmith的支持)

+0

埃,PlaceCats是連接表。我下載了最新的PLINQO模板並重新生成了代碼。多對多的關係在那裏。我問了這個場景:我需要列出父類別的每個子類別中的位置,假定PlaceCats表沒有將父類別連接到位置的條目。 – Chaddeus 2011-03-24 00:24:04

+0

我已經改變了我的設計,我只是簡單地將父類別分配給PlaceCats表格中的地方...不需要查詢。但我真的很感謝快速回復,並且我仍然會將此查詢放入我的代碼中供以後使用。非常感激。 – Chaddeus 2011-03-24 00:25:00

+0

請標記爲已回答。 – 2011-07-07 17:41:48

相關問題