如何在Include上应用Skip和Take



我有一个Name为Tag的类。每个标签都有一些NewsArticle和"轮询"。我想要得到所有相关的帖子有标签。要做到这一点,我使用这个查询:

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

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

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

您不能将不是属性表达式的表达式传递给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());
}

最新更新