2014-05-12 106 views
0
SELECT * FROM Recipe WHERE ID IN 
    (SELECT RID FROM Recipe_Ingredient WHERE IID IN 
      (SELECT MIN(ID) FROM Ingredients WHERE Name IN('broccoli','egg'))) 

我想将这个SQL查询翻译成LINQ。到目前为止,我没有运气。SQL到LINQ翻译

我收到一个字符串数组的成分。到目前为止,我得到了这一点:

List<string> searchList = new List<string>(search); 
var ing = context.Ingredients.Where(x => x.Name.Contains(searchList.ToString())).ToList(); 
var recing = context.Recipe_Ingredients.Where(x => ing.Contains(x.IID)).Select(x => x.IID).ToList(); 
var rec = context.Recipes.Where(x => recing.Contains(x.ID)).ToList(); 

但是,通过使用它,因为searchListx.Name包含(searchList[0] = 'egg'当我使用它用于测试)

db schema

+0

你在你生成的类具有导航性能(例如在Recipe_Ingredient的IngredientList属性)? –

回答

0

ing失败调试器在生产线上有一个小错误。前2个ToList方法是多余的。

List<string> searchList = new List<string>(search); 
var ing = context.Ingredients.Where(x => searchList.Contains(x.Name)); 
var recing = context.Recipe_Ingredients.Where(x => ing.Contains(x.IID)).Select(x => x.IID); 
var rec = context.Recipes.Where(x => recing.Contains(x.ID)).ToList(); 
0

您并未翻译SQL中的MIN(...)

var searchList = new List<string>(search); // broccoli, egg 
var recipies = context.Recipes 
    .Where(r => 
     context.Recipe_Ingredients 
      .Where(ri => 
       context.Ingredients 
        .Where(i => searchList.Contains(i.Name)) 
        .Select(i => i.ID) 
        .Min() == ri.IID 
      ) 
      .Select(ri => ri.RID) 
     .Contains(r.ID) 
    ) 
    .ToList(); 
0
  1. 你颠倒包含(你不这样做的条款)
  2. 敏(ID)不能是一个列表(在你的SQL查询),这将是一个独特的ID。
  3. 不要把ToList()太早,它会产生多个查询。

所以留下来靠近你的代码,你可以做

List<string> searchList = new List<string>(search); 
var ingId = context.Ingredients.Where(x => searchList.Contains(x.Name)).Min(m => m.Id); 
var recing = context.Recipe_Ingredients.Where(x => x.IID == ingId).Select(x => x.RID); 
var rec = context.Recipes.Where(x => recing.Contains(x.ID)).ToList(); 
+0

'Min(m => m.Id)'**的用法将会生成一个查询。 – Maarten

+0

@Maarten我知道,我知道。可读性和性能之间的选择(或者在这种情况下,尽可能地保持OP的尝试不变) –