LINQ如何查询值是否在范围列表之间?

Mak*_*san 4 c# linq linq-to-sql

假设我在数据库中有一个Person记录,并且该人员有一个Age字段.

现在我有一个页面,允许我过滤特定年龄段的人.

例如,我可以选择多个范围选择,例如"0-10","11-20","31-40".

所以在这种情况下,我会找回0到20之间的人员列表,以及30到40,但不是21-30.

我已经采用了年龄范围并填充了如下所示的范围列表:

class AgeRange
{ 
     int Min { get; set; }
     int Max { get; set; }
}

List<AgeRange> ageRanges = GetAgeRanges();
Run Code Online (Sandbox Code Playgroud)

我正在使用LINQ to SQL进行数据库访问和查询,但我无法弄清楚如何查询范围.

我想做这样的事情,但当然,这不起作用,因为我无法根据SQL值查询我的本地值:

var query = from person in db.People 
            where ageRanges.Where(ages => person.Age >= ages.Min && person.Age <= ages.Max).Any())
            select person;
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 10

您可以使用PredicateBuilder以下命令动态构建谓词:

static Expression<Func<Person, bool>> BuildAgePredicate(IEnumerable<AgeRange> ranges)
{
    var predicate = PredicateBuilder.False<Person>();
    foreach (var r in ranges)
    {
        // To avoid capturing the loop variable
        var r2 = r;
        predicate = predicate.Or (p => p.Age >= r2.Min && p.Age <= r2.Max);
    }
    return predicate;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此方法,如下所示:

var agePredicate = BuildAgePredicate(ageRanges);
var query = db.People.Where(agePredicate);
Run Code Online (Sandbox Code Playgroud)