实体框架 4:多对多关系 IQueryable 而不是 ICollection

Joh*_*ohn 2 c# entity-framework-4

大家,早安,

我正在尝试首先解决我在使用 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; }
}
Run Code Online (Sandbox Code Playgroud)

我已经编写了代码,我可以用它从数据库中检索一个类别,而实际上不知道它是一个类别。从那时起,我必须再次检索该类别的一篇文章,而不知道它是一篇文章。对于类别,我依赖 ContentNode 基类和 IUrlNode 接口上的文章。

类别检索工作正常,并且使用单个查询,但在我实际获得类别后,我必须使用反射来获取 RouteChild 属性指向的导航属性,以找到符合我的条件的单篇文章。问题是导航属性类型是 ICollection,这意味着它最多只能使用延迟加载,并将从数据库中获取所有文章,并在内存中找到我正在寻找的文章。

我的问题也在上一篇文章中描述过(不是我写的):

实体框架代码优先 IQueryable

有没有办法让导航属性作为 IQueryable 或其他一些可以绕过这个限制的设计?

Lad*_*nka 5

不,没有办法拥有导航属性,IQueryable但您可以IQueryable使用以下方法将集合更改为:

IQueryable<Article> query = context.Entry(category).Collection(c => c.articles).Query();
query.Where(...).Load();
Run Code Online (Sandbox Code Playgroud)

一般来说,你的“算法”看起来很奇怪。您想使用基类,但同时又想访问子属性。这听起来不对,很可能可以用更好的方式解决(非“通用”方式也更好)。