Как написать запрос LINQ или лямбда-выражение для отношения один ко многим с фильтром - PullRequest
1 голос
/ 02 марта 2010

Я думал о том, как написать правильный запрос LINQ или лямбда-выражение для отношения один ко многим, в то время как выполняю надлежащую фильтрацию сущности на стороне «многие» для Entity Framework.

Итак, две сущности:

Рецепт
ID
название тип [маленький | большой]

Ингредиент
ID
RecipeID
Имя
тип [обычный | экзотический]

Так, как написать запрос LINQ, который выбирает рецепты, которые являются маленькими и имеют экзотические ингредиенты?

Это может выглядеть так:

var smallExoticRecipes = contex.Recipes.Include("Ingredients").Where(recipe => recipe.Type == "small" && ????);

Что мне нужно написать вместо «????»? Или я должен попытаться использовать LINQ-запрос вместо лямбда-выражения?

UPDATE:
В предложении «Выбрать» я хотел бы выбрать только рецепты и их экзотические ингредиенты без обычных, хотя они также могут иметь?

Итак:

Я должен идти так, верно?

.Select(recipe => new { recipeName = recipe.Name, recipeIgredients = recipe.Ingredients.Where(ing => ing.Type == "exotic" });

Ответы [ 2 ]

2 голосов
/ 02 марта 2010
var smallExoticRecipes = contex.Recipes.Include("Ingredients").Where(recipe => recipe.Type == "small" && recipe.Ingredients.Any(i => i.type == "exotic"));

Конечно, вы можете разделить это для ясности:

Func<Recipe, bool> hasExoticIngredients = r => r.Ingredients.Any(i => i.type == "exotic");
var smallExoticRecipes = context.Recipes.Include("Ingredients").Where(recipe => recipe.Type == "small" && hasExoticIngredients(recipe));

Другой вариант:

Func<Recipe, bool> hasExoticIngredients = r => r.Ingredients.Any(i => i.type == "exotic");
Func<Recipe, bool> isSmallAndExotic = r => recipe => recipe.Type == "small" && hasExoticIngredients(recipe)
var smallExoticRecipes = context.Recipes.Include("Ingredients").Where(isSmallAndExotic);
0 голосов
/ 02 марта 2010
var smallExoticRecipes = contex.Recipes.Include("Ingredients").Where(recipe => recipe.Type == "small" && ingredients.Any( ingredient => ingredient.recipeid == recipe.id && ingredient == "exotic"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...