【问题标题】:Linq Include Select from Navigation PropertyLinq 包括从导航属性中选择
【发布时间】:2016-04-15 08:46:09
【问题描述】:

我正在使用以下内容来尝试查找与特定组织关联的单个成员记录;

var dataRow = db.Organisation
    .Include(x => x.Member.Select(m => m.Guid == MemberGuid))
    .Where(x => x.Guid == OrganisationGuid)
    .FirstOrDefault();

但是这会引发以下错误;

“包含路径表达式必须引用在类型上定义的导航属性。引用导航属性使用虚线路径,集合导航属性使用选择运算符。参数名称:路径”

包含路径有效,如果我取出“.Select(m => m.Guid == model.MemberGuid)”,它会返回组织的成员集合,然后我必须对其进行处理以找到所需的成员.

有没有办法在不返回整个集合的情况下找到特定成员?

【问题讨论】:

  • 我认为您可能希望以不同的方式构建查询,并避免在这种情况下使用 Include,如果您提供更多关于您希望从每个集合中获取哪些数据的信息,我可以帮助您.
  • OrganizationMember 表使用 OrganisationMember 表具有多对多关系,该表当然不会显示在 EF6 中,因为它是一个导航属性。所以我试图确定一个组织是否有一个特定的成员 - 我不想从包含返回整个成员集合。

标签: c# linq entity-framework-6


【解决方案1】:

您的查询中有两个错误。首先,您尝试使用.Select 过滤记录,您只会在列中获得true/false 记录。您应该改用.Where。其次,.Include 接受导航属性,而不是查询。

var dataRow = db.Organisation
    .Include(x => x.Member)
    .Where(x => x.Member.Guid == MemberGuid && x.Guid == OrganisationGuid)
    .FirstOrDefault();

另一种解决方案是使用连接:

var dataRow = (from o in db.Organisation
              join m in db.Member
              on o.MemberGuid equals m.MemberGuid
              where o.Guid == OrganisationGuid && m.Guid == MemberGuid
              select o).FirstOrDefault();

【讨论】:

  • 我忘了提到这些表使用中间表来创建多对多关系。当我收到错误“'System.Collections.Generic.ICollection<_projectname_.data.member>'不包含'Guid'的定义并且没有扩展方法'Guid'接受一个尝试使用“x.Member.**Guid** == MemberGuid”时,可以找到“System.Collections.Generic.ICollection<_projectname_.data.member>”类型的第一个参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
相关资源
最近更新 更多