大家早上好,
我正在努力解决我首先遇到的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,这意味着它最多只能使用延迟加载,并将从数据库中提取所有文章,并在内存中找到我要查找的文章。
我的问题也在前一篇文章(不是我)中描述:
Entity Framework Code First IQueryable
有没有办法将导航属性设置为IQueryable或其他一些可以绕过此限制的设计?
答案 0 :(得分:4)
没有办法将导航属性设为IQueryable
,但您可以使用以下方法将集合更改为IQueryable
:
IQueryable<Article> query = context.Entry(category).Collection(c => c.articles).Query();
query.Where(...).Load();
通常你的“算法”看起来很奇怪。您希望使用基类,但同时要访问子属性。这听起来很错误,最有可能以更好的方式解决(非“通用”方式也更好)。