大家,早安,
我试图首先解决我在 EF 代码中遇到的问题。我的架构如下
public class Article : IUrlNode
{
[Key]
public Guid ArticleID { get; set; }
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateUpdated { get; set; }
public string Summary { get; set; }
[System.ComponentModel.DataAnnotations.InverseProperty("CategoryArticles")]
public virtual IQueryable<Category> ArticleCategories { get; set; }
public string FriendlyUrl
{
get;
set;
}
}
[RouteChild("CategoryArticles")]
public class Category : ContentNode
{
public Guid ServiceId { get; set; }
[System.ComponentModel.DataAnnotations.InverseProperty("ArticleCategories")]
public virtual IQueryable<Article> CategoryArticles { get; set; }
}
我编写了代码,可以使用它从数据库中检索类别,而无需实际知道它是一个类别。从那时起,我必须再次检索该类别的一篇文章,而不知道它是一篇文章。对于类别,我依赖于 ContentNode 基类,对于文章,我依赖于 IUrlNode 接口。
类别检索工作正常并且使用单个查询,但在我实际获得类别之后,我必须使用反射来获取 RouteChild 属性指向的导航属性,以找到与我的条件匹配的单篇文章。问题是导航属性类型是 ICollection,这意味着它最多会使用延迟加载,并会从数据库中获取所有文章,并会在内存中找到我要查找的文章。
我的问题在上一篇文章中也有描述(不是我写的):
实体框架代码优先 IQueryable
有没有办法将该导航属性设置为 IQueryable 或其他可以绕过此限制的设计?
不,没有办法将导航属性设置为IQueryable
但你可以将集合更改为IQueryable
通过使用:
IQueryable<Article> query = context.Entry(category).Collection(c => c.articles).Query();
query.Where(...).Load();
一般来说,你的“算法”看起来很奇怪。您想要使用基类,但同时想要访问子属性。这听起来是错误的,而且很可能可以用更好的方式解决(非“通用”方式也更好)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)