使用参数列表查询多对多关系

时间:2019-01-01 14:05:22

标签: entity-framework linq many-to-many entity-framework-core

我使用EF核心,并且具有与多对多关系相关的类“ User”和“ Authority”(“ Users”具有属性“ authorities”,“ Authority”具有属性“ users” )。通过中间类“ UserAuthority”管理该关系。

我需要用特定名称查询所有具有“权限”的“用户”。

我尝试过:

List<string> authorities = A list of authorities;
(from user in this.dbContext.user.Include("authorities.authority")
 where authorities.Any(x => user.authorities.Any(y => y.authority.authority == x))
 select new UserDto(user.id, user.firstname + " " + user.lastname)).ToList()

但是控制台说LINQ无法翻译

authorities.Any(x => user.authorities.Any(y => y.authority.authority == x))

,它将在内存中处理。

这里正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

当前唯一可翻译的内存中收集方法是Contains(对于原始类型的内存中收集,转换为SQL IN(...))。

所以不是

authorities.Any(x => user.authorities.Any(y => y.authority.authority == x))

使用

user.authorities.Any(ua => authorities.Contains(ua.authority.authority))

答案 1 :(得分:0)

您写道:

  

i具有与“多对多”关系连接的类“ User”和“ Authority”(“ Users”具有属性“ authorities”,“ Authority”具有属性“ users”)。

类似这样的东西:

data: {'_token': <?php echo $token; ?>}
  

我需要用特定名称查询所有具有“权限”的“用户”。

如果我从字面上看,您希望所有class User { public int Id {get; set;} ... // every User has zero or more Authorities (many-to-many) public virtual ICollection<Authority> Authorities {get; set;} } class Authority { public int Id {get; set;} public string Name {get; set;} ... // every Authority has zero or more Users (many-to-many) public virtual ICollection<User> Users {get; set;} } ,其中至少有一个Users,其AuthorityName的集合中。您希望每个certainNames都带有他的所有User,甚至是那些名字不在Authorities

中的Authorities

这也可能意味着您希望所有certainNames,每个Users中只有Authorities位于Name中的certainNames,而只有{{ 1}},其中至少有一个Users

如何?

Authority

换句话说:

从所有用户的集合中,仅保留具有至少一个权限且名称也包含在someNames中的那些用户。从其余用户中,选择几个属性。

如果您不想获得用户的所有权限,而只希望拥有特定名称的用户:

IEnumerable<string> certainNames = ...
var UsersWithAuthoritiesThatAreInCertainNames = myDbContext.Users
    .Where (user => user.Authorities.Select(authority => authority.Name)
         .Intersect(certainNames)
         .Any())
    .Select(user => new
    {
         // select only the User properties you actually plan to use:
         Id = user.Id,
         Name = user.Name,
         ...

         Authorities = user.Authorities.Select(authority => new
         {
             // again select only the Authority properties you plan to use:
             Id = authority.Id,
             Name = authority.Name,
             ...
         })
         .ToList(),
    })

换句话说:

从“用户”集合中,选择每个用户的某些属性,包括仅具有相同名称的用户的那些Authority的某些属性。在剩余的选定用户序列中,仅保留那些至少拥有一个权限的用户