我使用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))
,它将在内存中处理。
这里正确的方法是什么?
答案 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
,其Authority
在Name
的集合中。您希望每个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的某些属性。在剩余的选定用户序列中,仅保留那些至少拥有一个权限的用户