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

时间:2010-10-19 17:43:35

标签: entity-framework linq-to-entities projection

我的数据库包含三个表: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之间重新排序权限。我不知道为什么会发生这种情况,或者为什么我没有得到预期的结果。

1 个答案:

答案 0 :(得分:0)

你的错误在这里: -

 System.Console.Writelin(item.PermissionCategory.Permissions);

您正在输出权限类别的所有权限。它应该是: -

 System.Console.Writelin(item.Permissions);

使用您创建的投影仅使用与该用户相关的权限。