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

时间:2011-09-26 07:45:42

标签: 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; }
}

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

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

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

Entity Framework Code First IQueryable

有没有办法将导航属性设置为IQueryable或其他一些可以绕过此限制的设计?

1 个答案:

答案 0 :(得分:4)

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

IQueryable<Article> query = context.Entry(category).Collection(c => c.articles).Query();
query.Where(...).Load();

通常你的“算法”看起来很奇怪。您希望使用基类,但同时要访问子属性。这听起来很错误,最有可能以更好的方式解决(非“通用”方式也更好)。