2014-05-08 67 views
0

我想寫一個半曲查詢: -的LINQ查詢沒有在連接表

查詢應從表中選擇行的隨機選擇,不具有在連接表中的匹配項。 I

dishes 
---- 
id 
name 


food 
---- 
id 
name 

foodInDishes 
---- 
food_id 
dish_id 

所以我想要完成的是選擇用戶沒有特定食物的最上面10行。所以

「給我10道菜,我可以不含有胡蘿蔔」

在C#我的食物,避免一個List<int>。到目前爲止,我也得到了: -

List<int> oFoodsToAvoid = new List<int>(); 
var oDishes= db.dishes.OrderBy(r => Guid.NewGuid()).Take(10); 

但是,我正在努力與食物,以避免where子句。我面臨的問題是因爲它是一個子表(即items.foods.id)。關於什麼條款應包含什麼建議?

回答

1

你可以使用一個簡單的嵌套lambda來實現這一點。如果oFoodsToAvoid很大,你很可能在查詢之前進行排序,然後使用Array.BinarySearch()在嵌套拉姆達:

List<int> oFoodsToAvoid = new List<int>(); 
var oDishes= db.dishes.Where(d => !d.foods.Any(df => oFoodsToAvoid.Any(arr => arr == df.food_id))) 
         .OrderBy(r => Guid.NewGuid()).Take(10); 
+0

可惜,這只是查詢菜表,我需要我查詢連接到菜餚食物表(IE瀏覽器.foods.id不是r.id)這是我目前正在'掛斷'的地方。 –

+0

@JohnMitchell:已更新。再次檢查。 – dotNET

+0

非常感謝!這就是訣竅! –