2009-11-29 3 views
1

У меня есть таблица рецептов, которая имеет таблицу связанных ингредиентов на основе одного на много.Выбор на большой таблице с использованием Linq

Как выбрать с помощью ингредиентов Linq , которые имеют колонку с ингредиентомName и должны содержать указанное слово.

Это то, что я пробовал.

IQueryable<OurRecipes.Domain.Linq2Sql.Recipe> recipes = _dbctx.Recipes.AsQueryable(); 

    foreach (string word in searchdata.Keywords) 
    { 
     recipes = recipes.Where(r => r.RecipeTitle.Contains(word)); 
     recipes = recipes.Where(r => r.Ingredients.Where(i => i.IngredientName.Contains(word))); 
    } 

Я получаю не могу преобразовать тип 'etc' в ошибку bool.

Любые идеи Malcolm

ответ

2

Ошибка лежит здесь:

recipes = recipes.Where(r => r.Ingredients.Where(i => i.IngredientName.Contains(word))); 

Состояние внутри Where должен возвращать логическое значение, в данном случае, r.Ingredients.Where(i => i.IngredientName.Contains(word)) не возвращает логическое значение, и, следовательно, ошибка.

Это, как вы можете решить эту проблему:

recipes = recipes.Where(i => i.Ingredients.Any(row=>row.IngredientName.Contains(word))); 
+0

+1, и исправление должно изменить эту строку на что-то вроде 'recipes = recipes.Where (r => r.Ingredients.Count (i => i.IngredientName.Contains (word))> 0);' –

+0

Ваше решение не будет компилироваться, потому что 'i'' 'Recipie'. У него нет 'IngredientName'. –

+0

Отвечено обновлено ... – Graviton

1
r.Ingredients.Where(i => i.IngredientName.Contains(word)));  

заменить

r.Ingredients.Any(i => i.IngredientName.Contains(word)));  

BTW, мне нравится SQL подобный синтаксис больше, поскольку это более NETURAL. То же самое:

from r in _dbctx.Recipes 
where r.Ingredients.Any(i => i.IngredientName.Contains(word))); 
select r; 

Это выберет все рецепты, в которых есть ингредиенты с именем, содержащим слово.

Смежные вопросы