Entity framework 实体框架投影查询中的相关数据未绑定在一起

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 {

我的数据库包含三个表:PermissionCategories、Permissions和Users。权限和用户之间存在多对多关系,由UserPermissions表解析

使用实体框架投影,我试图获得所有的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中包含的列表权限被重新排序,将预期值放在第一位。该列表还包括不应出现在列表中的所有值(权限不是来自用户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实体上所有权限的延迟加载集,第二个是您创建的一个投影,其中包含一个过滤后的权限列表。好吧,这不是我希望的答案,但它是有意义的。谢谢