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