LINQ如何查询是否值范围列表之间? [英] LINQ how to query if a value is between a list of ranges?

查看:278
本文介绍了LINQ如何查询是否值范围列表之间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我们说我有一个数据库中的个人记录,并且有一个年龄字段的人。



现在我有一个页面,让我来过滤人在某些年龄范围。



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



因此,在这种情况下,我回来的人0和20之间的列表,以及30至40,但不是21-30。

我已经采取了年龄范围,人口范围的列表,看起来像这样:

 类年龄范围
{
INT敏{搞定;组; }
INT最大{搞定;组; }
}

名单,LT;年龄范围> ageRanges = GetAgeRanges();



我使用LINQ到SQL对我的数据库访问和查询,但我无法弄清楚如何。查询范围



我想要做这样的事情,当然,这是不行的,因为我无法查询我的本地值对SQL值:

  VAR的查询=从人db.People 
,其中ageRanges.Where(年龄=> person.Age> = ages.Min和放大器;&安培; person.Age< = ages.Max)。任何())
选择的人;


解决方案

您可以建立谓词动态地的 PredicateBuilder

 静态表达式来; Func键<人,布尔>> BuildAgePredicate(IEnumerable的<年龄范围>范围)
{
VAR谓词= PredicateBuilder.False<&人GT;();
的foreach(在范围变种R)
{
//为了避免捕获循环变量
变种R 2 = R;
谓语= predicate.Or(P => p.Age> = r2.Min和放大器;&安培; p.Age< = r2.Max);
}
返回谓语;
}

您可以使用这个方法如下:

  VAR agePredicate = BuildAgePredicate(ageRanges); 
VAR的查询= db.People.Where(agePredicate);


Let's say I have a Person record in a database, and there's an Age field for the person.

Now I have a page that allows me to filter for people in certain age ranges.

For example, I can choose multiple range selections, such as "0-10", "11-20", "31-40".

So in this case, I'd get back a list of people between 0 and 20, as well as 30 to 40, but not 21-30.

I've taken the age ranges and populated a List of ranges that looks like this:

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

List<AgeRange> ageRanges = GetAgeRanges();

I am using LINQ to SQL for my database access and queries, but I can't figure out how query the ranges.

I want to do something like this, but of course, this won't work since I can't query my local values against the SQL values:

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

解决方案

You could build the predicate dynamically with 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;
}

You can then use this method as follows:

var agePredicate = BuildAgePredicate(ageRanges);
var query = db.People.Where(agePredicate);

这篇关于LINQ如何查询是否值范围列表之间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆