Моя база данных содержит три таблицы: 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. Я не знаю, почему это происходит, или почему я не получаю ожидаемых результатов.