LINQ如何查询是否值范围列表之间? [英] LINQ how to query if a value is between a list of ranges?
问题描述
让我们说我有一个数据库中的个人记录,并且有一个年龄字段的人。
现在我有一个页面,让我来过滤人在某些年龄范围。
例如,我可以选择多个范围选择,如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屋!