我正在学习C#,我跟着一个site,我成功地使用了我的CSV文件,我可以正确查询文件。
var productsNetherlands =
from p in products
where p.Country == "Netherlands"
select new { p.Name, p.LaunchDate, p.Price, p.Description };
在上面的代码中,我正在过滤“荷兰”。我的问题是如何在该部分使用变量而不是硬编码“荷兰”?
例如:
var productsNetherlands =
from p in products
where p.Country == s_variable
select new { p.Name, p.LaunchDate, p.Price, p.Description };
我的s_variable是
string s_variable = "Netherlands";
错误显示“错误4当前上下文中不存在名称's_variable'”
答案 0 :(得分:0)
这意味着给定的查询提供程序根本不支持此功能。大多数其他主流查询提供程序会注意到诸如此类的变量用法,将其计算为其值,然后将该值用作常量。无论出于何种原因,这个特定的查询提供者都选择不这样做。
理想的解决方案是简单地改进查询提供程序以处理这种情况。这可能是也可能不是你的选择。
您做的一个选项是自己编写一个方法,该方法接受您想要使用的表达式,并将其编译为查询提供程序可以理解的表达式。
要覆盖您的equals表达式,我们可以使用自定义Equals
方法:
public static Expression<Func<TSource, bool>> Equal<TSource, TKey>(
Expression<Func<TSource, TKey>> expression, TKey value)
{
var body = Expression.Equal(expression.Body, Expression.Constant(value));
return Expression.Lambda<Func<TSource, bool>>(body, expression.Parameters[0]);
}
可以这样使用:
var productsNetherlands = products.Where(
Equal<Product>(p => p.Country, s_variable))
.Select(p => [...]);