我正在尝试编写一个半复杂的查询: -
查询应从表中选择随机选择的行,这些行在链接表中没有匹配的条目。即
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子句应该包含什么的任何建议?
答案 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);