Linq к сущностям: не удается заставить запрос коллекции работать

#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 . Кстати, я этого не делал.