在连接表上查询NOT IN

本文关键字:NOT IN 查询 连接 | 更新日期: 2023-09-27 18:02:12

我想写一个半复杂的查询:-

查询应该从一个在链接表中没有匹配条目的表中随机选择行。即

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.food .id)。对where子句应该包含什么有什么建议吗?

在连接表上查询NOT IN

您可以使用一个简单的嵌套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);