Linq在连接表上查询NOT IN

时间:2014-05-08 03:21:35

标签: c# linq entity-framework-5

我正在尝试编写一个半复杂的查询: -

查询应从表中选择随机选择的行,这些行在链接表中没有匹配的条目。即

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);

然而,我正在努力避免食物中的条款。我面临的问题是因为它是一个子表(即items.foods.id)。关于where子句应该包含什么的任何建议?

1 个答案:

答案 0 :(得分:1)

您可以使用简单的嵌套lambda来实现此目的。如果oFoodsToAvoid很大,您可以在查询之前对其进行排序,然后在嵌套的lambda中使用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);