我有以下代表简单关系的实体类。
user => NetworkRoles => NetworkRolePrivilege => UserPrivilege
class user
{
protected ICollection<UserNetworkRole>
NetworkRoles{ get; set; }
}
class NetworkRoles
{
public ICollection<NetworkRolePrivilege> NetworkRolePrivilege { get; set; }
}
class NetworkRolePrivilege
{
public UserPrivilege UserPrivilege { get; set; }
}
class UserPrivilege
{
public bool Enabled { get; set; }
}
我想从UserPrivilege表中获取具有Enabled标志为true的用户。我无法获取LINQ查询。以下是我尝试的代码片段。
db.user.Where(x=>x.NetworkRoles.Where(m=>m.NetworkRolePrivilege.Where(k=>k.UserPrivilege.Enabled))) // does not work due to last where condition.
以下操作无效,因为未定义导航属性
db.user.Include(x => x.NetworkRoles.Select(m => m.NetworkRolePrivilege.Select(l => l.UserPrivilege.Enabled)))
通过一些搜索,我发现我们需要为其使用投影,但无法获取。
var query = db.user.Select(x=>new
{
user = x,
networkRolePrivilege = x.NetworkRoles.SelectMany(n=>n.NetworkRolePrivilege.Where(m=>m.UserPrivilege.Enabled))
}).....
请帮助Linq查询,以使用户启用UserPrivilege = true
预先感谢
更新
由于NetworkRoles不直接是映射属性或导航属性,文斯答案给出了以下错误
System.NotSupportedException:在LINQ to Entities中不支持指定的类型成员'NetworkRoles'。仅支持初始化程序,实体成员和实体导航属性。'
答案 0 :(得分:1)
尝试
using System;
using System.Collections.Generic;
using System.Linq;
namespace TestThings
{
class Program
{
static void Main(string[] args)
{
List<User> users = new List<User>() {
new User(){
Name = "User1",
NetworkRoles = new List<NetworkRole>() {
new NetworkRole(){
Description = "NetworkRole1",
NetworkRolePrivileges = new List<NetworkRolePrivilege>() {
new NetworkRolePrivilege(){
Description = "NetworkRolePrivilege1",
UserPrivilege = new UserPrivilege(){
Description = "NetworkRolePrivilege",
Enabled = false
}
}
}
}
}
},
new User(){
Name = "User2",
NetworkRoles = new List<NetworkRole>() {
new NetworkRole(){
Description = "NetworkRole2",
NetworkRolePrivileges = new List<NetworkRolePrivilege>() {
new NetworkRolePrivilege(){
Description = "NetworkRolePrivilege2",
UserPrivilege = new UserPrivilege(){
Description = "NetworkRolePrivilege3",
Enabled = true
}
}
}
}
}
}
};
var _users = users.Where(u=> u.NetworkRoles.SelectMany(x=>x.NetworkRolePrivileges).Where(x=>x.UserPrivilege.Enabled).Any()).ToList();
foreach(var u in _users)
{
Console.WriteLine(u.Name);
}
Console.ReadKey();
}
}
class User
{
public string Name { get; set; }
public ICollection<NetworkRole> NetworkRoles { get; set; } = new List<NetworkRole>();
}
class NetworkRole
{
public string Description { get; set; }
public ICollection<NetworkRolePrivilege> NetworkRolePrivileges { get; set; }
}
class NetworkRolePrivilege
{
public string Description { get; set; }
public UserPrivilege UserPrivilege { get; set; }
}
class UserPrivilege
{
public string Description { get; set; }
public bool Enabled { get; set; }
}
}