我的数据库包含三个表:PermissionCategories,Permissions和Users。权限和用户之间存在多对多关系,由UserPermissions表解析。
使用Entity Framework投影我正在尝试获取所有PermissionCategories并包含(急切加载)userId过滤的权限。
我的查询如下:
var data = from pc in ctx.PermissionCategories
select new
{
PermissionCategory = pc,
Permissions = (
from p in pc.Permissions
where p.Users.Any(u => u.UserId == userId)
select p
)
};
输出结果的示例迭代:
foreach (var item in data)
{
// category name
System.Console.Writelin(item.PermissionCategory.Name);
// DOES NOT CONTAIN THE RESULTS I EXPECT
System.Console.Writelin(item.PermissionCategory.Permissions);
// spacer
System.Console.Writelin("");
// category name
System.Console.Writelin(item.PermissionCategory.Name);
// DOES CONTAIN THE RESULTS I EXPECT
System.Console.Writelin(item.Permissions);
}
似乎重新排序了PermissionCategory中包含的Permissions列表,将预期值放在第一位。同样的列表还包括不应出现在列表中的所有值(权限不是来自userID)。
据我所知,使用投影的EF应该允许所有实体在检索时加入图形。换句话说,将“item.Permissions”中的权限分配给关联的实体“item.PermissionCategory.Permissions”。
我做错了什么?
示例:
我有三个权限。名称=“A”,“B”,“C”。
我有两个PermissionCategories。 Names =“TestCategory 1”,“TestCategory 2”
我有两个用户,userID为1和2。
在我的模型中,用户拥有权限(映射多对多)。我希望我的查询获取所有PermissionCategories,并包括由特定用户ID过滤的所有权限。
示例1:userId 1具有权限A和B.
userID 1的结果应为:
TestCategory 1 A B TestCategory 2
TestCategory 2中的“权限”列表将为空。
示例2:userId 2具有权限B和C
userID 2的结果应为:
TestCategory 1 B TestCategory 2 C
目前,我的查询产生了这个:
对于userID 1:
TestCategory 1 A B TestCategory 2 C
对于userID 2:
TestCategory 1 B A TestCategory 2 C
请注意在userID 1和2之间重新排序权限。我不知道为什么会发生这种情况,或者为什么我没有得到预期的结果。
答案 0 :(得分:0)
你的错误在这里: -
System.Console.Writelin(item.PermissionCategory.Permissions);
您正在输出权限类别的所有权限。它应该是: -
System.Console.Writelin(item.Permissions);
使用您创建的投影仅使用与该用户相关的权限。