2013-03-05 40 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