Связанные данные в запросе проекции Entity Framework не связаны друг с другом - PullRequest
1 голос
/ 19 октября 2010

Моя база данных содержит три таблицы: 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);
}

Похоже, что список Permissions, включенный в PermissionCategory, переупорядочен, в первую очередь ожидаемые значения. Этот же список также включает в себя все значения, которые не должны отображаться в списке (разрешения, не полученные из идентификатора пользователя).

Насколько я понимаю, EF, используя проекцию, должен позволять объединять все сущности в графы по мере их извлечения. Другими словами, назначьте Разрешения, как видно в «item.Permissions», для связанной сущности «item.PermissionCategory.Permissions».

Что я делаю не так?

Примеры:

У меня есть три разрешения. Имена = "A", "B", "C".

У меня есть две категории разрешений. Names = "TestCategory 1", "TestCategory 2"

У меня есть два пользователя, userID's 1 и 2.

В моей модели пользователи имеют разрешения (сопоставленные «многие ко многим»). Я хочу, чтобы мой запрос получал все PermissionCategories и включал все разрешения, отфильтрованные по определенному идентификатору пользователя.

Пример 1: userId 1 имеет разрешения A и B.

Результат для идентификатора пользователя 1 должен быть:

   TestCategory 1
        A
        B
    TestCategory 2

Список «разрешений» внутри TestCategory 2 будет пустым.

Пример 2: userId 2 имеет разрешения B и C

Результат для userID 2 должен быть:

   TestCategory 1
        B
    TestCategory 2
        C

В настоящее время мой запрос производит это:

Для ИД пользователя 1:

   TestCategory 1
        A
        B
    TestCategory 2
        C

Для ИД пользователя 2:

   TestCategory 1
        B
        A
    TestCategory 2
        C

Обратите внимание на изменение порядка разрешений между userID 1 и 2. Я не знаю, почему это происходит, или почему я не получаю ожидаемых результатов.

1 Ответ

0 голосов
/ 20 октября 2010

Ваша ошибка здесь: -

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

Вы выводите ВСЕ разрешения для категории разрешений.Это должно быть: -

 System.Console.Writelin(item.Permissions);

, которое использует созданную вами проекцию только с разрешениями, относящимися к этому пользователю.

...