#asp.net #linq-to-entities #entitycollection
#asp.net #linq-to-entities #entitycollection
Вопрос:
Я изо всех сил пытаюсь получить коллекцию записей, используя L2E. Вот представление модели: http://pascalc.nougen.com/stuffs/aspnet_linq_model2.png
У меня есть идентификатор пользователя, который связан с 1 или многими группами пользователей, которые сами связаны с TestCase. Я хотел бы получить все тестовые наборы всех групп, с которыми связан идентификатор пользователя X.
Я также замечаю, что я не получаю весь проект для пользователей, которые связаны с 2 (или более).
Вот как я делаю до сих пор:
QASModel.QASEntities qasEntities = new QASModel.QASEntities();
QASModel.User authenticatedUserEntity = (from u in qasEntities.Users
where u.ID.Equals(authenticatedUserId)
select u).FirstOrDefault();
// Get the authenticated user usergroups
var usergroup = authenticatedUserEntity.UserGroups.FirstOrDefault();
// Get all testcases of all user group the authenticated user is associated to
var allTestcases = usergroup.TestCases;
// Get the authenticated user projects based on it's usergroup(s)
var authenticatedUserProjects = usergroup.Projects;
authenticatedUserProjects возвращает только 1 проект, в котором пользователь связан с 2 проектами.
И allTestcases не возвращает результата, хотя в тестовых наборах есть около 8 записей, связанных с проектом, связанным с одной и той же группой пользователей, к которой принадлежит пользователь.
Спасибо
Комментарии:
1. Хитрость заключалась в том, чтобы представить определение в виде списка:
List<QASModel.TestCase> allTestCases = new EntityCollection<QASModel.TestCase>().ToList();
затем объединить:allTestCases = allTestCases.Concat(usergroup.TestCases).ToList();
Ответ №1:
Я думаю, что ваша проблема в этой строке:
var usergroup = authenticatedUserEntity.UserGroups.FirstOrDefault();
Разве ваш код не должен получать все UserGroups
из этого User
? Приведенная выше строка вернет только 1 UserGroup
, то есть, если пользователь принадлежит более чем к 1 UserGroup
, второй не будет возвращен.
Чтобы исправить это:
var userTestCases = new List<TestCase>();
var userProjects = new List<Project>();
foreach(UserGroup ug in authenticatedUserEntity.UserGroups)
{
userTestCases = userTestCases.Concat(ug.TestCases);
// Get the authenticated user projects based on it's usergroup(s)
userProjects = userProjects.Concat(ug.Projects);
...
}
Комментарии:
1. Спасибо Лениэль, единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что, когда у пользователя связано более 1 группы пользователей, переменные (allTestcases и authenticatedUserProjects) сбрасываются при каждом проходе в foreach (). Как я могу «связаться» с каждым результатом на каждом проходе?
2. Он жалуется, что не может преобразовать из IEnumerable в List в concat (). Спасибо
Ответ №2:
var usergroup = authenticatedUserEntity.UserGroups.FirstOrDefault();
вероятно, это неправильно, поскольку вы хотите, чтобы все группы пользователей, с которыми связан пользователь.
В любом случае вы можете легко вернуть запрос к работе следующим образом
var testcases = from tc in new QASModel.QASEntities().TestCases
where tc.UserGroup.UserId == USERID
select tc
Таким образом, вам не придется выполнять несколько запросов, чтобы получить все тестовые случаи, каждый FirstOrDefault, ToList или ForEach фактически выполнят запрос.
Комментарии:
1. Спасибо AD.Net но у меня нет свойства «userId» в «tc.UserGroup. Идентификатор пользователя «Я пытался
where tc.UserGroup.Users.Select(x => x.ID.Equals(authenticatedUserId))
, но это нехорошо. Я новичок в L2E. Спасибо2. Ну, конечно, у меня сейчас нет с собой контекста, так что я, возможно, пропустил его. Из того, что я вижу, это может быть tc.UserGroup. Пользователи. Любой (u => u.ID.Equals(authenticatedUserId) Или tc.UserGroup. Пользователи. userId == authenticatedId (если в каждой группе только один пользователь) Кстати: не было необходимости в -ve. Спасибо.
3. Спасибо за комментарий AD.Net . Кстати, я этого не делал.