我有一种方法,接受两个List<int>
我需要从数据库中获取基于List<>
s的数据。从数据库中筛选项目基于List <>
所以,我收到例如List<PersonId>
和List<NationalityId>
,我需要得到一个结果集,其中记录匹配PersonIds
和NationalistId
秒。
public List<PersonDTO> SearchPeople(List<int> persons, Lisy<int> nationalities)
{
var results = (from c in myDbContect.People where .... select c).ToList();
}
请注意,我认为列表可能为空。
有没有一种有效的方法? 我要去尝试:
where ((persons != null && persons.Count > 0) && persons persons.Contains(x=>x.PersonId))
但是,这会产生相当低效的SQL,并为我添加更多的搜索参数,LINQ的可能会非常混乱。
有没有一种有效的方法来实现这一目标?
连接方法可能很容易阅读,但我面临的问题是,如果输入列表为空,那么它不应该过滤。也就是说,如果民族是空的,没有任何过滤出来:
var results = (from c in entities.Persons
join p in persons on c.PersonId equals b
join n in nationalities on c.NationalityId equals n
等于n 选择C).ToList();
如果任何列表为空,则不会返回结果。哪个不好。
“但这会产生效率相当低的SQL” - 你怎么知道的?过滤最好在数据库中完成..... –
听起来像你想加入... http://stackoverflow.com/questions/2723985/linq-join-2-listts – felickz
@MitchWheat,而你在说什么是真的,在这种特殊情况下,如果列表包含超过大约2000个项目的组合,那么所得到的查询将根本无法执行 - 列表中的所有值均被转换为每个参数,并且sql查询对数量有限制的参数。 –