5

現在、LINQ と Entity Framework 5.0 を使用して Web ベースの「レシピ」アプリケーションを作成しています。私はしばらくこのクエリに苦労してきたので、どんな助けも大歓迎です!

ユーザーがレシピ結果に一致させたい材料のリストを入力できる検索機能があります。関連する成分コレクション (name プロパティ) に、文字列のリスト (ユーザー検索語) 内のすべてのレコードのテキストが含まれているすべてのレシピを見つける必要があります。たとえば、次の 2 つのレシピを考えてみましょう。

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();

ご協力ありがとうございました!

4

1 に答える 1

6

頭のてっぺんから、私はこのようなものに行きます

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 は、これを行うことができるという点で非常に優れています。次に、関数の最後でクエリ可能なものを確定し、基本的に、実行したすべてのことを単一のクエリに変換して DB に戻すことができます。

私の唯一の他のメモは、あなたが本当に成分名列のインデックス作成/全文インデックス作成をしたいということです。そうしないと、これはひどくうまくスケーリングされません。

于 2013-02-23T04:26:51.303 に答える