gpt4 book ai didi

LINQ to EF - 查找子集合的字符串属性至少部分匹配字符串列表中的所有记录的记录

转载 作者:行者123 更新时间:2023-12-04 18:45:26 25 4
gpt4 key购买 nike

我目前正在使用 LINQ 和 Entity Framework 5.0 编写基于 Web 的“配方”应用程序。我一直在为这个查询苦苦挣扎,所以非常感谢任何帮助!

将有一个搜索功能,用户可以在其中输入他们希望配方结果匹配的成分列表。我需要找到所有食谱,其中关联的成分集合(名称属性)包含字符串列表(用户搜索词)中每条记录的文本。例如,考虑以下两个配方:

Tomato Sauce: Ingredients 'crushed tomatoes', 'basil', 'olive oil'
Tomato Soup: Ingredients 'tomato paste', 'milk', 'herbs

如果用户使用搜索词“番茄”和“油”,它将返回番茄酱而不是番茄汤。
var allRecipes = context.Recipes
.Include(recipeCategory => recipeCategory.Category)
.Include(recipeUser => recipeUser.User);

IQueryable<Recipe> r =
from recipe in allRecipes
let ingredientNames =
(from ingredient in recipe.Ingredients
select ingredient.IngredientName)
from i in ingredientNames
let ingredientsToSearch = i where ingredientList.Contains(i)
where ingredientsToSearch.Count() == ingredientList.Count()
select recipe;

我也试过:
var list = context.Ingredients.Include(ingredient => ingredient.Recipe)
.Where(il=>ingredientList.All(x=>il.IngredientName.Contains(x)))
.GroupBy(recipe=>recipe.Recipe).AsQueryable();

感谢您的帮助!

最佳答案

就在我的头顶上,我会去做这样的事情

public IEnumerable<Recipe> SearchByIngredients(params string[] ingredients)
{
var recipes = context.Recipes
.Include(recipeCategory => recipeCategory.Category)
.Include(recipeUser => recipeUser.User);
foreach(var ingredient in ingredients)
{
recipes = recipes.Where(r=>r.Ingredients.Any(i=>i.IngredientName.Contains(ingredient)));
}

//Finialise the queriable
return recipes.AsEnumerable();

}

然后您可以使用以下方法调用它:
SearchByIngredients("tomatoes", "oil");

或者
var ingredients = new string[]{"tomatoes", "oil"};
SearchByIngredients(ingredients );

这将要做的是将 where 子句附加到每个搜索词的可查询配方。多个 where 子句在 SQL 中被视为 AND(无论如何,这就是您想要的)。 Linq 在我们可以做到这一点的方式上非常好,在函数结束时,我们最终确定了可查询对象,基本上说我们刚刚做的所有事情都可以变成一个返回数据库的单个查询。

我唯一的另一个注意事项是您真的想要索引/全文索引成分名称列,否则这不会很好地扩展。

关于LINQ to EF - 查找子集合的字符串属性至少部分匹配字符串列表中的所有记录的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15037010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com