如何将查询语法转换为流畅的语法?

时间:2017-04-03 13:54:03

标签: c# linq

我想将查询语法转换为流畅的语法,但我不能这样做。我不知道我可以在此代码中使用流利语法中的两个子句“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);
    }
}

3 个答案:

答案 0 :(得分:0)

  

我可以在此代码中使用流利语法中的两个子句“where”吗?

您可以链接Where子句,但它们会被解释为AND子句而不是OR子句(因为数据必须通过所有Where过滤器)。< / p>

将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))

答案 1 :(得分:0)

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

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

答案 2 :(得分: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)