Entity framework 实体框架投影查询中的相关数据未绑定在一起
我的数据库包含三个表:PermissionCategories、Permissions和Users。权限和用户之间存在多对多关系,由UserPermissions表解析 使用实体框架投影,我试图获得所有的PermissionCategories,并包括(急切加载)由userId过滤的权限 我的查询如下所示:Entity framework 实体框架投影查询中的相关数据未绑定在一起,entity-framework,linq-to-entities,projection,Entity Framework,Linq To Entities,Projection,我的数据库包含三个表:PermissionCategories、Permissions和Users。权限和用户之间存在多对多关系,由UserPermissions表解析 使用实体框架投影,我试图获得所有的PermissionCategories,并包括(急切加载)由userId过滤的权限 我的查询如下所示: var data = from pc in ctx.PermissionCategories select new {
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中包含的列表权限被重新排序,将预期值放在第一位。该列表还包括不应出现在列表中的所有值(权限不是来自用户ID)
我的理解是,EF使用投影,应该允许在检索图形时将所有实体连接到图形中。换句话说,将“item.Permissions”中的权限分配给关联实体“item.PermissionCategory.Permissions”
我做错了什么
示例:
我有三个权限。名称=“A”、“B”、“C”
我有两类许可证。name=“TestCategory 1”、“TestCategory 2”
我有两个用户,userID的1和2
在我的模型中,用户拥有权限(映射的多对多)。我希望我的查询获得所有PermissionCategories,并包括由特定用户ID过滤的所有权限
示例1:UserID1具有权限A和B
用户标识1的结果应为:
TestCategory 1
A
B
TestCategory 2
TestCategory 1
B
TestCategory 2
C
测试类别1
A.
B
测试类别2
TestCategory 2中的“权限”列表将为空
示例2:UserID2具有权限B和C
userID 2的结果应该是:
TestCategory 1
A
B
TestCategory 2
TestCategory 1
B
TestCategory 2
C
测试类别1
B
测试类别2
C
当前,我的查询生成以下内容:
对于用户标识1:
TestCategory 1
A
B
TestCategory 2
C
测试类别1
A.
B
测试类别2
C
对于用户标识2:
TestCategory 1
B
A
TestCategory 2
C
测试类别1
B
A.
测试类别2
C
请注意用户ID 1和2之间权限的重新排序。我不知道为什么会发生这种情况,或者为什么我没有得到预期的结果。您的错误在这里:-
System.Console.Writelin(item.PermissionCategory.Permissions);
您正在输出权限类别的所有任务。应该是:-
System.Console.Writelin(item.Permissions);
它使用了您创建的投影,并且仅具有与该用户相关的权限。您的描述似乎有点模糊。你能提供一些你拥有的样本数据,并在列表中显示你所期望的与你实际得到的相比吗?是的,但我认为EF会将“item.PermissionCategory.Permissions”替换为“item.Permissions”。示例:“…所有实体在检索时都将在图形中连接。这样,枚举中的cust将已经拥有其所有订单,并附加了行项目和产品。”另一个示例:“在实体框架中,对象服务会自动将在称为修复的过程中相关的事物连接在一起。”为什么在我的示例中不会发生这种情况?
item.PermissionCategory
仍然是一个“活动”实体,它将愉快地延迟加载附加到它的所有.Permissions。没有魔法可以将item.PermissionsCategory.Permissions“替换”为item.Permissions。第一个是一个PermissionsCategory实体上所有权限的延迟加载集,第二个是您创建的一个投影,其中包含一个过滤后的权限列表。好吧,这不是我希望的答案,但它是有意义的。谢谢