Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在循环中构建动态linq表达式树_C#_Linq - Fatal编程技术网

C# 如何在循环中构建动态linq表达式树

C# 如何在循环中构建动态linq表达式树,c#,linq,C#,Linq,给定以下字符串arrray: string[] ranges = new string[]{"0-100", "100-200", "500-1000"}; 我想用linq表达式动态地表达这一点,大致如下: var query = from p in Db.Products() where p.Amount() >= 0 where p.Amount() <= 100 where p.Amount() >

给定以下字符串arrray:

string[] ranges = new string[]{"0-100", "100-200", "500-1000"};
我想用linq表达式动态地表达这一点,大致如下:

var query = from p in Db.Products()
            where p.Amount() >= 0
            where p.Amount() <= 100
            where p.Amount() >= 101
            where p.Amount() <= 200
            where p.Amount() >= 500
            where p.Amount() <= 1000
            select p;

请使用以下代码进行尝试:

           var result= from range in ranges
                       select new 
                       {
                           min = int.Parse(range.Split('-').First()),
                           max = int.Parse(range.Split('-').Last()) 
                       };

结果包含所有最小值和最大值…

使用以下代码进行尝试:

           var result= from range in ranges
                       select new 
                       {
                           min = int.Parse(range.Split('-').First()),
                           max = int.Parse(range.Split('-').Last()) 
                       };
结果包含所有最小值和最大值…

如下所示:

IQueryable<Product> query = DB.Products();
foreach (var item in ranges)
{
    int min = int.Parse(item.Split('-').First());
    int max = int.Parse(item.Split('-').Last());                
    query = query.Where(p => p.Amount() >= min && p.Amount() <= max);
}
我只有你的where子句的一半,但它是等价的。如果你真的愿意,你可以把它拆开

请注意返回查询的赋值-Where等方法返回一个新查询,该查询是将操作应用于现有查询的结果;它们不会更改现有查询中的任何内容。

如下所示:

IQueryable<Product> query = DB.Products();
foreach (var item in ranges)
{
    int min = int.Parse(item.Split('-').First());
    int max = int.Parse(item.Split('-').Last());                
    query = query.Where(p => p.Amount() >= min && p.Amount() <= max);
}
我只有你的where子句的一半,但它是等价的。如果你真的愿意,你可以把它拆开


请注意返回查询的赋值-Where等方法返回一个新查询,该查询是将操作应用于现有查询的结果;它们不会更改现有查询中的任何内容。

注意;非常小心不要在任何表达式树中直接使用项本身;这将捕获变量,而不是任何给定迭代中的值。目前的方法是获取最小值和最大值等,并在查询中使用这些值;非常小心不要在任何表达式树中直接使用项本身;这将捕获变量,而不是任何给定迭代中的值。当前获取最小值和最大值等并在查询中使用这些值的方法很好。IEnumerable可以在IQueryable上使用吗?@Fixer:这取决于您希望在哪里执行查询。给定名称,我假设这是一个LINQ到SQL查询或类似的查询。如果是LINQ to Objects,或者如果您希望在本地执行过滤,那么是的,您完全可以使用IEnumerable。IEnumerable可以在IQueryable上使用吗?@Fixer:这取决于您希望在哪里执行查询。给定名称,我假设这是一个LINQ到SQL查询或类似的查询。如果是LINQ到对象,或者如果您希望过滤在本地完成,那么是的,您完全可以使用IEnumerable。