我有一个接受两个List<int>的方法,我需要根据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可能会变得非常混乱。
有没有一种有效的方法来实现这一点?
join方法可能很容易阅读,但我面临的问题是,如果输入列表为空,那么它就不应该进行过滤。也就是说,如果国家是空的,不要过滤掉任何:
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();
如果任何列表为空,则不会返回任何结果。这是很糟糕的。
发布于 2015-10-05 12:58:20
如果您将IQueryable与IEnumerable (在本例中为entities.Persons和persons)连接在一起,则不会在您的查询中进行过滤。相反,您的连接被枚举,从数据库中检索所有记录,而连接是使用IEnumerable IQueryable方法在内存中执行的。
要对查询中的列表执行筛选,有两个主要选项:
在两端使用IQueryable的
如果您希望在列表为空时跳过过滤,则可以考虑使用扩展方法调用而不是LINQ语法。这允许您使用if语句:
IQueryable<Person> persons = entities.persons;
List<int> personIds = new List<int>();
if(personIds.Count > 0)
{
persons = persons.Where(p => personIds.Contains(p.PersonId));
}
var results = persons.ToList();请注意,Where谓词使用上面的选项#2,并且仅在集合中有任何in时才应用。
发布于 2015-10-05 12:51:39
如果您想要获取人员的所有记录,例如,如果列表为空,则根据nationalityId列表进行过滤,如果列表不为空,则可以这样做:
List<int> personsIds = ...;
List<int> nationalitiesIds = ...;
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
where ((personsIds == null || personsIds.Contains(p.Id))
&& (nationalitiesIds == null || nationalitiesIds.Contains(n.Id))
select c).ToList();https://stackoverflow.com/questions/32940689
复制相似问题