我有一个特定的问题,在普通列表上使用嵌套查询。
我有2个模型类:
public class IngridientModel
{
public long Id { get; set; }
public string Ingredient { get; set; }
}
和
public class RecipesModel
{
[Key]
public long Id { get; set; }
public string RecipyName { get; set; }
public string Description { get; set; }
public List<OwnedIngredientsModel> Ingredients { get; set; }
}
每个类别的对象都可以包含多种成分。
现在我创建了2个列表:
清单1:我拥有的成分和可用的hava
清单2:食谱清单
现在我想创建第3个列表。 该列表只能包含我目前拥有的配料(列表1)的配方,并且不应包含我目前没有的配方食谱。所以在上面的例子中,我的查询应该只产生Fruit pie和Fast dinner的食谱。
这是我尝试做嵌套查询的方法
public void WhatCanICook()
{
// List of recipes i can make
List<RecipesModel> myRecipes = new List<RecipesModel>();
// list of ingredients
var myIngredients = ListViewIngredients.ToList();
// list of all recipies, each recipy contains many ingredients
var allRecipies = ListViewAllRecipies.ToList();
// query, i would like to only list recipies with ingredients i own
foreach (var item in myIngredients)
{
var result = allRecipies.Where(p =>
JsonConvert.SerializeObject(p.Ingredients) == JsonConvert.SerializeObject(item));
}
}
但是这个查询没有做我想要它做的事情:(
答案 0 :(得分:0)
您可以使用类似......
之类的内容进行查询allRecipes.Where(r => r.Ingredients.All(i => myIngredients.Any(m => m.Id == i.Id)));
如果具有相同Id的Ingredient对象保证引用同一个对象,您可以将其略微缩短为...
allRecipes.Where(r => r.Ingredients.All(i => myIngredients.Contains(i)));
如果由于存储在列表中并且涉及嵌套循环而存在大量成分,则两个查询都会出现严重的性能问题。这可以通过使用集合来改进。