2017-04-03 114 views
0

我想转换查询语法流利的语法,但我不能这样做。我不知道我可以在这段代码中使用流利语法中的两个子句“where”吗?如何将查询语法转换为流利的语法?

public static void Ex6() 
{ 
    string[] csvRecipes = { "milk,sugar,eggs", "flour,BUTTER,eggs", "vanilla,ChEEsE,oats" }; 
    var dairQuery= 
     from csvRecipe in csvRecipes 
     let ingredients = csvRecipe.Split(',') 
     from ingredient in ingredients 
     let uppercaseIngredient=ingredient.ToUpper() 
     where uppercaseIngredient =="MILK" || 
     uppercaseIngredient == "BUTTER" || 
     uppercaseIngredient == "CHEESE" 
     select uppercaseIngredient; 
    foreach (var item in dairQuery) 
    { 
     Console.WriteLine("{0} is dairy", item); 
    } 
} 
+2

注意'join's在查询语法特别干净。如果你只是把它作为一种学习练习,那就没问题,但不要讨厌使用其中一种。 –

+1

为此使用Linqpad。 –

回答

0

我觉得这确实好看多了,你想要什么。

var query = csvRecipes.Select(x => x.Split(',')) 
         //flatten the list 
         .SelectMany(y => y) 
         //ToUppercase Again 
         .Select(x => x.ToUpper()) 
         .Where(i => i == "MILK" || 
            i == "BUTTER" || 
            i == "CHEESE"); 

如果要比较字符串忽略序的情况下,你可以使用i => i.Equals("MILK", StringComparison.OrdinalIgnoreCase)

0

我可以用两个条款“其中”在此代码流利的语法?

你可以连续Where条款,但后来他们都被解释为AND条款,而不是OR条款(因为数据必须通过所有Where过滤器)。

适当的方式来转换where子句来一口流利的将是:

.Where(item => item.uppercaseIngredient == "MILK" || 
       item.uppercaseIngredient == "BUTTER" || 
       item.uppercaseIngredient == "CHEESE") 

另外,您可以使用的物品的集合与Contains

var validTypes = new string[] { "MILK", "BUTTER", "CHEESE"}; 

... 
.Where(item => validTypes.Contains(item.uppercaseIngredient)) 
0

我会使用一个集合,其中您储存你想要选择的成分。然后你可以使用SelectMany找到所有匹配的令牌这个简洁查询:

string[] ingredients = new[] { "MILK", "BUTTER", "CHEESE" }; 
var dairQuery = csvRecipes 
    .SelectMany(r => r.Split(',').Select(i => i.ToUpper()).Where(ingredients.Contains)); 
相关问题