【问题标题】:Linq to Entities: can't get collection query to workLinq to Entities:无法让集合查询工作
【发布时间】:2011-05-30 20:45:04
【问题描述】:

我正在努力使用 L2E 获取记录集合。这是模型视图: http://pascalc.nougen.com/stuffs/aspnet_linq_model2.png

我有一个用户标识符,它与 1 个或多个用户组相关联,这些用户组本身链接到 TestCase。我想获取与用户 id X 关联的所有组的所有 TestCases。

我还注意到,我没有为与 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 没有返回任何结果,尽管 TestCases 中有大约 8 个条目与与用户所属的同一 UserGroup 之一相关联的项目相关联。

谢谢

【问题讨论】:

  • 诀窍是将定义转换为列表:List<QASModel.TestCase> allTestCases = new EntityCollection<QASModel.TestCase>().ToList(); 然后连接:allTestCases = allTestCases.Concat(usergroup.TestCases).ToList();

标签: asp.net linq-to-entities entitycollection


【解决方案1】:

我认为你的问题出在这一行:

var usergroup = authenticatedUserEntity.UserGroups.FirstOrDefault();

您的代码不应该得到所有UserGroupsUser 吗?上面一行将只返回 1 个UserGroup,也就是说,如果用户属于多个UserGroup,则不会返回第 2 个。

要纠正这个问题:

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);

    ...
}

【讨论】:

  • 感谢 Leniel,我现在唯一遇到的问题是,当用户关联的用户组超过 1 个时,变量(allTestcases 和 authenticatedUserProjects)在 foreach() 中每次传递都会“重置”。我如何在每次通过中“联系”每个结果?
  • 它抱怨它无法在 concat() 上从 IEnumerable 转换为 List。谢谢
【解决方案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 都会实际执行查询。

【讨论】:

  • 感谢 AD.Net,但我在“tc.UserGroup.UserId”中没有属性“UserId”我试过where tc.UserGroup.Users.Select(x =&gt; x.ID.Equals(authenticatedUserId)),但这并不好。我是 L2E 的新手。谢谢
  • 嗯,当然我现在没有上下文,所以我可能错过了。据我所知,它可能是 tc.UserGroup.Users.Any(u=>u.ID.Equals(authenticatedUserId) OR tc.UserGroup.Users.UserId == authenticatedId (如果每个组只有一个用户)顺便说一句:那里不需要-ve。谢谢。
  • 感谢 AD.Net 的评论。顺便说一句,我没有那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多