2011-08-18 59 views
0

我想从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

这将是更容易帮助你,如果你向我们展示你已经尝试过,但像这样的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); 
+0

这个查询坏了,你有没有错误的东西可能? – laszloj

+0

@ st4rlight - 你没有提供你的模型的任何细节,所以我尽我所能地猜出了名字。如果你想得到更准确的答案,你需要向我们展示一些你的代码 – Aducci

+0

同时我去了一个存储过程。谢谢你的帮助! – laszloj