首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于List<>从数据库中筛选项目

基于List<>从数据库中筛选项目
EN

Stack Overflow用户
提问于 2015-10-05 11:02:52
回答 2查看 1.4K关注 0票数 1

我有一个接受两个List<int>的方法,我需要根据List<>从数据库中获取数据。

例如,我收到一个List<PersonId>List<NationalityId>,我需要获得一个记录与PersonIdsNationalistId匹配的结果集。

代码语言:javascript
复制
public List<PersonDTO> SearchPeople(List<int> persons, Lisy<int> nationalities)
{
  var results = (from c in myDbContect.People where .... select c).ToList();
}

请注意,我认为列表可能为空。

有没有有效的方法?我正要试着:

代码语言:javascript
复制
where ((persons != null && persons.Count > 0) && persons persons.Contains(x=>x.PersonId))

但是这将生成效率相当低的SQL,并且随着我添加更多的搜索参数,linq可能会变得非常混乱。

有没有一种有效的方法来实现这一点?

join方法可能很容易阅读,但我面临的问题是,如果输入列表为空,那么它就不应该进行过滤。也就是说,如果国家是空的,不要过滤掉任何:

代码语言:javascript
复制
    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();

如果任何列表为空,则不会返回任何结果。这是很糟糕的。

EN

回答 2

Stack Overflow用户

发布于 2015-10-05 12:58:20

如果您将IQueryableIEnumerable (在本例中为entities.Personspersons)连接在一起,则不会在您的查询中进行过滤。相反,您的连接被枚举,从数据库中检索所有记录,而连接是使用IEnumerable IQueryable方法在内存中执行的。

要对查询中的列表执行筛选,有两个主要选项:

在两端使用IQueryable

  1. 加入。如果您的if列表来自另一个查询的执行,则这可能是可能的,在这种情况下,您可以在联接中使用基础查询,而不是结果if集。
  2. 对列表使用contains运算符。这只适用于小列表,因为每个额外的id都需要它自己的查询参数。如果您有多个ids,则可以使用批处理来扩展此方法。

如果您希望在列表为空时跳过过滤,则可以考虑使用扩展方法调用而不是LINQ语法。这允许您使用if语句:

代码语言:javascript
复制
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时才应用。

票数 1
EN

Stack Overflow用户

发布于 2015-10-05 12:51:39

如果您想要获取人员的所有记录,例如,如果列表为空,则根据nationalityId列表进行过滤,如果列表不为空,则可以这样做:

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32940689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档