使用LINQtoCSV在C#中进行CSV查询

使用LINQtoCSV在C#中进行CSV查询,c#,linq,C#,Linq,我正在学习C#,我遵循了一个成功使用CSV文件的方法,我可以正确地查询该文件 var productsNetherlands = from p in products where p.Country == "Netherlands" select new { p.Name, p.LaunchDate, p.Price, p.Description }; 在上面的代码中,我正在过滤“荷兰”。我的问题是如何在该部分使用变量,而不是硬编码“荷兰” 例如: var produc

我正在学习C#,我遵循了一个成功使用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_变量在哪里

string s_variable = "Netherlands";

错误显示“错误4当前上下文中不存在名称的_变量”

这意味着给定的查询提供程序根本不支持此操作。大多数其他主流查询提供程序都会注意到这样的变量用法,将其计算为其值,然后将该值当作常量使用。无论出于何种原因,这个特定的查询提供程序选择不这样做

理想的解决方案是简单地改进查询提供程序,使其能够处理这种情况。但这可能是你的一个选择,也可能不是

您可以选择自己编写一个方法,该方法接受您想要使用的表达式,并将其编译为查询提供程序可以理解的表达式

为了涵盖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]);
}
公共静态表达式等于(
表达式,TKey值)
{
var body=Expression.Equal(Expression.body,Expression.Constant(value));
返回表达式.Lambda(body,Expression.Parameters[0]);
}
可以这样使用:

var productsNetherlands = products.Where(
    Equal<Product>(p => p.Country, s_variable))
    .Select(p => [...]);
var productsNetherlands=产品。其中(
相等(p=>p.国家,s_变量))
.选择(p=>[…]);

使用
s\u变量的示例应该可以正常工作。你试过了吗?你写的应该很好用。您对此代码有问题吗?有。错误显示为“name s_变量在当前上下文中不存在”,请确保它在范围内并在linqThanks上面声明,我将其公开,并且工作正常。虽然我在查询上方声明了s_变量,但它不起作用,所以我将其公开。好的。我迷路了。我说过我是初学者吗I’谢谢你