gpt4 book ai didi

asp.net-mvc-3 - Entity Framework 、MVC 3、LINQ To Entities 中的 OrderBy

转载 作者:行者123 更新时间:2023-12-04 03:49:41 25 4
gpt4 key购买 nike

我有以下查询:

model.Page = db.Pages
.Where(p => p.PageId == Id)
.Include(p => p.Series
.Select(c => c.Comics
.Select(col => col.Collection)))
.SingleOrDefault();

这很好用,尽管我现在需要通过名为“ReadingOrder”的属性来订购漫画。

我试过了:
model.Page = db.Pages
.Where(p => p.PageId == Id)
.Include(p => p.Series.Select(c => c.Comics.OrderBy(o => o.ReadingOrder)
.Select(col => col.Collection)))
.SingleOrDefault();

但这会导致以下错误:

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



任何想法这个错误意味着什么?

提前致谢

编辑:

我的模型:
public class Page
{
public int PageId { get; set; }
public string Title { get; set; }
public ICollection<Series> Series { get; set; }
}

public class Series
{
public int SeriesId { get; set; }
public int PageId { get; set; }
public string Title { get; set; }
public Page Page { get; set; }
public ICollection<Comic> Comics { get; set; }
}

public class Comic
{
public int ComicId { get; set; }
public string Title { get; set; }
public int ReadingOrder { get; set; }
public string Subtitle { get; set; }
public int CollectionId { get; set; }
public Collection Collection { get; set; }

}

public class Collection
{
public int CollectionId { get; set; }
public string Title { get; set; }
public ICollection<Comic> Comics { get; set; }
}

最佳答案

异常“...包含路径表达式必须引用导航属性...”基本上提示c.Comics.OrderBy不是导航属性。 (我认为这是合理的投诉。)

实际上,EF 不支持在预先加载语句( Include )中应用排序(以及过滤)。

所以,你可以做什么?

选项1:

加载实体后在内存中排序:

model.Page = db.Pages
.Where(p => p.PageId == Id)
.Include(p => p.Series.Select(c => c.Comics
.Select(col => col.Collection)))
.SingleOrDefault();

if (model.Page != null)
{
foreach (var series in model.Page.Series)
series.Comics = series.Comics.OrderBy(c => c.ReadingOrder).ToList();
}

丑,但因为你显然只加载了一个 Page object by id 它可能比以下选项更快(LINQ to Objects in memory)(如果 SeriesComics 集合不是特别长)。

选项 2:

将查询分解为混合预加载和显式加载的部分:

model.Page = db.Pages
.Where(p => p.PageId == Id)
.Include(p => p.Series) // only Series collection is included
.SingleOrDefault();

if (model.Page != null)
{
foreach (var series in model.Page.Series)
db.Entry(series).Collection(s => s.Comics).Query()
.Include(c => c.Collection)
.OrderBy(c => c.ReadingOrder)
.Load(); // one new DB query for each series in loop
}

选项 3:

投影?

Herehere顺便说一下复杂的危险 Include多个导航属性链。它可以加载大量重复数据。 Include确保您只有一次数据库往返,但可能以传输更多数据为代价。显式加载有多次往返,但总共可能有更少的数据。

(我知道,我给了你这个 Include...Select...Select...Select... 链,但我怎么知道你会认真对待我:)。好吧,根据嵌套集合的大小,它仍然是最佳选择。)

关于asp.net-mvc-3 - Entity Framework 、MVC 3、LINQ To Entities 中的 OrderBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7179130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com