使用子查询的复杂SQL到LINQ转换

时间:2011-08-18 08:56:16

标签: sql linq

我正在尝试将此表达式从SQL转换为LINQ,但对我来说有点太难了,也许你可以帮我解决这个问题!

SELECT     TOP (2) RecipeID, UserID, Name, Servings, PreparationTime, TotalTime, DifficultyLevelID, CuisineID, DishID, MainIngredientID, PriceLevelID, FlavourID, Instructions, 
                      Notes, Thumbnail, VideoLink
FROM         dbo.Recipes
WHERE     (RecipeID NOT IN
                          (SELECT DISTINCT Recipes_1.RecipeID
                            FROM          dbo.Allergies INNER JOIN
                                                   dbo.UsersAllergies ON dbo.Allergies.AllergyID = dbo.UsersAllergies.AllergyID INNER JOIN
                                                   dbo.IngredientsAllergies ON dbo.Allergies.AllergyID = dbo.IngredientsAllergies.AllergyID INNER JOIN
                                                   dbo.Ingredients ON dbo.IngredientsAllergies.IngredientID = dbo.Ingredients.IngredientID INNER JOIN
                                                   dbo.RecipesIngredients ON dbo.Ingredients.IngredientID = dbo.RecipesIngredients.IngredientID INNER JOIN
                                                   dbo.Recipes AS Recipes_1 ON dbo.RecipesIngredients.RecipeID = Recipes_1.RecipeID INNER JOIN
                                                   dbo.Users ON dbo.UsersAllergies.UserID = dbo.Users.UserID INNER JOIN
                                                   dbo.AllergyFactors ON dbo.IngredientsAllergies.AllergyFactorID = dbo.AllergyFactors.AllergyFactorID
                            WHERE      (dbo.Users.UserID = 3) AND (dbo.AllergyFactors.AllergyFactorID < 3)))

1 个答案:

答案 0 :(得分:1)

如果你向我们展示你已经尝试过的东西会更容易帮助你,但像这样的Linq表达式会给你相同的结果集

var query = (from rec in context.Recipes
            where !(from al in context.Allergies
                    from ua in context.UsersAllergies.Where(x => al.AllergyID == x.AllergyID)
                    from ia in context.IngredientsAllergies.Where(x => al.AllergyID == x.AllergyID)
                    from in in context.Ingredients.Where(x => ia.IngredientID == x.IngredientID)
                    from ri in context.RecipesIngredients.Where(x => in.IngredientID == x.IngredientID)
                    from re in context.Recipes.Where(x => ri.RecipeID == x.RecipeID)
                    from us in context.Users.Where(x => ua.UserID == x.UserID)
                    from af in context.AllergyFactors.Where(x => ia.AllergyFactorID == x.AllergyFactorID)
                    where us.UserID == 3 && af.AllergyFactorID < 3
                    select re.RecipeID)
                    .Distinct()
                    .Contains(rec.RecipeID)
            select new
            {
                rec.RecipeID, 
                rec.UserID, 
                rec.Name, 
                rec.Servings, 
                rec.PreparationTime, 
                rec.TotalTime, 
                rec.DifficultyLevelID, 
                rec.CuisineID, 
                rec.DishID, 
                rec.MainIngredientID, 
                rec.PriceLevelID, 
                rec.FlavourID, 
                rec.Instructions,
                rec.Notes, 
                rec.Thumbnail, 
                rec.VideoLink
            }).Take(2);