【问题标题】:The Include path expression must refer to a navigation property defined on the type.包含路径表达式必须引用在类型上定义的导航属性。
【发布时间】:2017-08-03 14:16:32
【问题描述】:

我的 linq 查询

   model.Questions = db.Questions
                     .Where (x => x.CategoriesID == categoryId)
                     .Include (qc => qc.QuestionCounters.Where(x => x.MemberID == User.Identity.GetUserId()))
                     .Include (qf => qf.QuestionFavorites.Where(x => x.MemberId == User.Identity.GetUserId()))
                     .Include (qt => qt.QuestionTags)
                     .ToList();

产生错误

'包含路径表达式必须引用导航属性 在类型上定义。使用虚线路径进行参考导航 属性和用于集合导航的 Select 运算符 属性。'

任何想法为什么会发生这种情况?

【问题讨论】:

标签: c# entity-framework linq eager-loading


【解决方案1】:

正如一些人评论的那样,您不能在 Include 中使用 Where 方法。

免责声明:我是项目的所有者Entity Framework Plus

EF+ Query IncludeFilter 功能允许过滤相关实体。

model.Questions = db.Questions
                 .Where (x => x.CategoriesID == categoryId)
                 .IncludeFiler (qc => qc.QuestionCounters.Where(x => x.MemberID == User.Identity.GetUserId()))
                 .IncludeFiler (qf => qf.QuestionFavorites.Where(x => x.MemberId == User.Identity.GetUserId()))
                 .IncludeFiler (qt => qt.QuestionTags)
                 .ToList();

维基:EF+ Query IncludeFilter

解决方案 #2

另一种技术是使用投影(这是我的库在后台所做的)

bd.Questions
     .Select(q = new {
        Question = q,
        QuestionCounters = q.QuestionCounters.Where(x => x.MemberID == memberId),
        QuestionFavorites = q.QuestionFavorites.Where(x => x.MemberId == memberId),
        QuestionTags = q.QuestionTags
     })
     .ToList()
     .Select(x => x.Question)
     .ToList();

【讨论】:

    【解决方案2】:

    好的。结束了

     IQueryable<HomeViewModel> test = db.Questions
                                      .Where(x => x.CategoriesID == categoryId)
                                      .Select(q => q.ToHomeViewModel(User.Identity.GetUserId()));
    

    public static HomeViewModel ToHomeViewModel(this Question q, string memberId)
    {
        return new HomeViewModel()
        {
            QuestionCounters = q.QuestionCounters.Where(x => x.MemberID == memberId),
            QuestionFavorites = q.QuestionFavorites.Where(x => x.MemberId == memberId),
            QuestionTags = q.QuestionTags
        };
    }
    

    到底怎么需要include? ;)

    感谢@jle 的评论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2016-02-26
      • 1970-01-01
      相关资源
      最近更新 更多