c# - 如何应用 Skip and Take on Include

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

我有一个名称为 Tag 的类。每个标签都有一些 NewsArticle 和 `Poll'。我想要 Get All Related Post 其中有 Tag 。 为此,我使用此查询:

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

但是当我运行 Project 时出现此错误:

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.

最佳答案

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

关于c# - 如何应用 Skip and Take on Include,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34528056/

相关文章:

c# - 如何最好地防止向字典中添加内容

linq - 保存 LINQ 查询以供以后使用的最简单方法是什么?

serialization - 如何使用 Json.NET 在 C# 中序列化 "union-like"字段

visual-studio-2010 - 如何在堆栈溢出发生之前查看堆栈?

c# - 无法从用法中推断出方法 '' 的类型参数。尝试明确指定类型参数

.net - 匿名 Oracle 参数?

c# - 在 ASP.NET C# 中抛出异常

c# - 如何对也在 Excel 中打开的文件执行 File.ReadAllLines?

c# - 从列表框中删除选定的项目

c# - 使用 OR 运算符在 LINQ 表达式中添加 Between 子句