如何在C#、LINQ中使用多值Contain拉取记录

wfypjpf4  于 2022-12-06  发布在  C#
关注(0)|答案(2)|浏览(212)

我正在使用实体框架核心的.NET 6应用程序。我正在使用LINQ创建记录搜索查询,我希望在那里接收字符串列表。字符串值的数量不是固定的,将发生变化。我如何在LINQ容器中使用列表?

List<string> Roles = new List<string>() { "Business Analyst", "Business Analysis Lead", "Application Support Analyst" };

var records = (from jobProfile in db.JobProfiles
          where jobProfile.Role.Contains(Roles) 
          select jobProfile).ToList();
gwbalxhn

gwbalxhn1#

大概是这样的:

var records = (
   from jobProfile in db.JobProfiles
   where jobProfile.Role.Any(r => Roles.Contains(r.Name))
   select jobProfile
).ToList();

或具有流畅界面:

var records = 
   db
   .JobProfiles
   .Where(jp => jp.Role.Any(r => Roles.Contains(r.Name)))
   .ToList();

Roles可以是任何IEnumerable。EF会将方法呼叫转换为IN子句。
请注意,如果源(此处为db.JobProfiles)不再是IQueryable,而是IEnumerable,则您将使用O(n).Contains调用。只要它是EF,就可以使用IEnumerable来表示Roles,因为在这种情况下实际上并没有调用.Contains,但对于LINQtoObjects,您可能希望确保它是某种类型的Set。
如果Role是一个string属性而不是一个实体,那么就简单一些:

var records = (
   from jobProfile in db.JobProfiles
   where Roles.Contains(jobProfile.Role)
   select jobProfile
).ToList();

或具有流畅界面:

var records = 
   db
   .JobProfiles
   .Where(jp => Roles.Contains(jp.Role))
   .ToList();
5ssjco0h

5ssjco0h2#

您需要按角色列表中包含职务配置文件角色的位置进行筛选:

var records = (from jobProfile in db.JobProfiles
               where Roles.Contains(jobProfile.Role) 
               select jobProfile).ToList();

...或流利地:

var records = db.JobProfiles
    .Where(x => Roles.Contains(x.Role))
    .ToList();

相关问题