2013-03-05 72 views
0

我在LINQ中做查询时遇到了麻烦。这在SQL中是非常简单的。无法访问LINQ中的中间表与实体框架?

这里是我的表:

database diagram

这是我要转换为LINQ查询:

SELECT * FROM Recipe WHERE IDRecipe IN ( 
        SELECT IDRecipe FROM RecipeTag 
         INNER JOIN Tag ON Tag.IDTag = RecipeTag.IDTag 
        WHERE Name LIKE '%{0}%') 

这里是我试过了,但问题是,奇怪的是,上下文中不存在表格RecipeTag。这似乎是在配方但是当我做db.Recipes.RecipeTag它不存在...

var recipeTag = from rt in db.RecipeTag 
       join tg in db.Tags on rt.IDTag equals tg.IDTag 
       where tg.Name.Contains(str) 
       select rt.IDRecipe; 

IEnumerable<Recipe> recipesTemp3 = (from recipe in db.Recipes 
            where recipeTag.Contains(recipe.IDRecipe) 
            select recipe).ToList(); 

我完全以新LINQ很抱歉,如果这是一个非常基本的问题,但我可以”找到任何地方的答案!

谢谢

回答

2

LINQ将多对多关系转换为每个外表上的集合属性。
根本不需要中间表。

相反,

from recipe in db.Recipes 
where recipe.RecipeTags.Any(t => t.Name.Contains(str)) 
select recipe 

或者更简单地说:

from tag in db.RecipeTags 
where tag.Name.Contains(str) 
from recipe in tag.Recipes 
select recipe 
+0

不知道 “更简单” 的版本更简单... :-) – joce 2013-03-05 23:24:03

+0

我同意@Joce,the第一个是更简单!这就是诀窍,现在我明白了一点点更好!谢谢 – 2013-03-05 23:29:27

+0

耶对不起延迟,我在我的评论后立即尝试,但它太早(需要等待x分钟) – 2013-03-06 13:25:57

0
var recipes = db.Recipes.Where(r=>r.RecipeTag.Any(t=>t.Tag.Name.Contains("whatever")).ToList(); 
0

如果我理解正确的话,你想:

var recipeTags = db.RecipeTags.Where(p => p.Tag.Name.Contains(str)).Select(p => p.Recipe).ToList(); 
+0

这将不会编译; 'Recipes'是一个集合 – SLaks 2013-03-05 23:23:38

+0

当然,每个RecipeTag实体都有一个分配给它的食谱实例? – chead23 2013-03-05 23:25:10

+0

否;标签中可以有多个配方。 – SLaks 2013-03-06 01:09:54