【问题标题】:how to apply Skip and Take on Include如何申请 Skip and Take on Include
【发布时间】:2015-12-30 10:53:13
【问题描述】:

我有一个名为 Tag 的类。每个标签都有一些 NewsArticle 和 `Poll'。我想要获取所有具有标签的相关帖子。 为此,我使用此查询:

 public Tag Get(string tagName, int page, int recordsPerPage = 10)
    {
        int skip = page * recordsPerPage;
        return 
            _tags.Where(tag => tag.Title.ToLower() == tagName.ToLower()).Include(row => row.Articles
            .OrderByDescending(n => n.Code).Skip(skip).Take(recordsPerPage).ToList())
            .Include(row => row.News.AsQueryable()).OrderBy(news => news.Code).Skip(skip).Take(recordsPerPage)
            .Include(row => row.Polls).OrderByDescending(poll => poll.Code).Skip(skip).Take(recordsPerPage).FirstOrDefault();
}

但是当我运行项目时,我得到了这个错误:

包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。

【问题讨论】:

  • 你只想要一个标签,为什么要调用Skip and Take方法?
  • 因为我按一个标签搜索,我应该得到 All Related News,Articlrs 与该标签。而且我第一次不显示所有项目我每页加载 10 条记录
  • 这个问题解决了吗?我遇到了完全相同的问题。

标签: c# linq c#-4.0 entity-framework-4


【解决方案1】:

您不能将表达式传递给不是属性表达式的 Include 方法,请查看您的代码

.Include(row => row.Articles.OrderByDescending(n => n.Code).Skip(skip).Take(recordsPerPage).ToList())


.Include(row => row.News.AsQueryable())

如你所见,在include里面,你调用了很多方法,这是不允许的。

您必须为此进行更改:

.Include(row => row.Articles)
.Include(row => row.News)

让我试着改进你的代码,你当前的代码是这样的:

_tags.Where(tag => tag.Title.ToLower() == tagName.ToLower()).Include(row => row.Articles
            .OrderByDescending(n => n.Code).Skip(skip).Take(recordsPerPage).ToList())
            .Include(row => row.News.AsQueryable()).OrderBy(news => news.Code).Skip(skip).Take(recordsPerPage)
            .Include(row => row.Polls).OrderByDescending(poll => poll.Code).Skip(skip).Take(recordsPerPage).FirstOrDefault();

让我们换行

_tags.Where(tag => tag.Title.ToLower() == tagName.ToLower())
     .Include(row => row.Articles.OrderByDescending(n => n.Code).Skip(skip).Take(recordsPerPage).ToList())
     .Include(row => row.News.AsQueryable())
     .OrderBy(news => news.Code)
     .Skip(skip)
     .Take(recordsPerPage)
     .Include(row => row.Polls)
     .OrderByDescending(poll => poll.Code)
     .Skip(skip)
     .Take(recordsPerPage)
     .FirstOrDefault();

如果你只需要一个标签,你不需要做这么大的方法链接,你可以使用这个来简化:

public Tag Get(string tagName, int page, int recordsPerPage = 10)
{
    return _tags.Include(tag => row.Articles).Include(tag => row.News).Include(tag => row.Polls)
         .OrderBy(tag => news.Code)
         .FirstOrDefault(tag => tag.Title.ToLower() == tagName.ToLower());
}

【讨论】:

  • 当用户点击 Tag 时,我应该显示所有使用 Thath Tag 的记录。为了获得最佳搜索结果,我不显示所有搜索结果。我每页播种 10 x 10 个 Recirds 。我使用 Skip and Take 为此
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 2017-05-30
  • 2011-04-25
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
相关资源
最近更新 更多