【发布时间】:2014-01-25 21:39:41
【问题描述】:
我无法让这个 LINQ 在哪里返回任何结果,我有几个这样的类:
public class RestaurantMenu
{
public List<MenuItem> MenuItems { get; set; }
}
public class MenuItem
{
public decimal Price { get; set; }
public List<FoodItem> FoodItems { get; set; }
}
public class FoodItem
{
public string Label { get; set; }
}
鉴于RestaurantMenu 的列表,我试图返回餐厅菜单的菜单项的食物项的标签与列表中的所有字符串匹配的任何匹配结果。基本上,你输入你想吃的食物,它应该返回任何有你想吃的东西的餐馆。它应该支持多个字符串,但我什至无法让它匹配一个字符串。
所以假设如下:
List<RestaurantMenu> allRestaurantMenus = /blah;
List<string> labelOfFoodsDesired = /blah;
我尝试通过像这样链接 where 表达式来做到这一点:
IQueryable<RestaurantMenu> query = allRestaurantMenus.AsQueryable();
foreach (string foodItem in labelOfFoodItemsDesired)
{
query = query.Where(x => x.MenuItems.Any(y => y.FoodItems.Select(z => z.Label).Contains(foodItem)));
}
List<RestaurantMenu> matchingRestaurantMenus = query.ToList();
但它总是不返回任何结果,即使通过调试我确定有匹配。我该如何编写这个查询?
【问题讨论】:
-
我认为您的链接调用有什么问题是您正在重新分配查询变量。因此,包含所有 allRestaurantMenus 的查询将设置为 null 或空列表。
-
如果我理解正确,那么不,事实并非如此。由于可查询对象的延迟执行,我可以像上面那样构造查询,并且在调用 list 之前它不会真正执行。这与执行 query.Where(x => Id == 2).Where(x => x.Id == 3).Where(x => x.Id == 4) 之类的操作没有什么不同。它在执行之前将它们组合成一个 query.Where(x => x.Id == 2 && x.Id == 3 && x.Id == 4) 查询。并不是说那会返回任何结果,因为那是不可能的,而这只是一个例子。
标签: c# linq collections