【问题标题】:LINQ Include errorLINQ 包含错误
【发布时间】:2014-12-11 18:27:05
【问题描述】:

我是使用 asp .net 和 LINQ 查询的新手。我编写了以下查询,但出现错误。

Include path expression must refer to a navigation property defined on the type

在上述问题中存在相同的错误,但他们根本没有解释为什么会发生这种情况。我相信这是因为我在下面的第三行中包含了内联 .First() 方法,但我再次想知道为什么会发生这种情况以及这意味着什么。感谢您的帮助。

错误:

The Include path expression must refer to a navigation property defined on the
type. Use dotted paths for reference navigation properties and the Select
operator for collection navigation properties.
Parameter name: path

查询:

IQueryable<User> users = db.Users
    .Where(u => u.Email == email)
    .Include(cu => cu.CompanyUsers.First())
    .Include(c => c.Companies)
    .Include(p => p.ParentCompanyAccounts );

【问题讨论】:

  • 你能说明User的定义吗?
  • @HamletHakobyan 我之前收到了其他查询,但问题是用户可以在多个公司中,所以在我收到多个结果之前,这就是为什么我先放在那里。生病发布模型的重要部分。谢谢

标签: c# database linq linq-to-entities


【解决方案1】:

问题出在查询的第 3 行。当你使用Include 方法包含一些东西时,你不能只取一个对象。你必须把它们都拿走。

那么你在哪里:

.Include(cu =&gt; cu.CompanyUsers.First())

应该是:

.Include(cu =&gt; cu.CompanyUsers);

要更好地了解如何使用Include,我建议查看this MSDN post

【讨论】:

    【解决方案2】:

    您不能在Include 调用中使用First。如果要使用Include,则需要包含所有的相关值。

    【讨论】:

    • 有没有办法将调用限制为一个,或者我必须在查询执行后这样做?
    • @Ellery 无法使用Include 过滤集合,没有。
    • @Ellery 使用Include 的全部意义在于您希望立即将所有内容加载到内存中。否则,您正在寻找不同的东西。
    【解决方案3】:

    您可以使用临时属性和持久属性。

    class User
    {
        ....
        public virtual ICollection<User> CompanyUsers {get; set;} //persistent property
    
        [NotMapped]
        public User FirstCompanyUser   //transient property
        {
             get{ return CompanyUsers.FirstOrDefault(); }
        }
    }
    

    如果您使用数据优先方法,您可以使用部分类以避免重新生成时的代码丢失。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多