我正在发布OData服务。我有两个需要暴露给OData端点的模型。我已经抽象了我的模型,以便于在下面显示博客/帖子模型。当两者都存储在DB中的视图中时,此服务很有效。在这种情况下,当有人使用$ expand来包含Posts属性时,表会自动加入和取消。我使用EF的Include方法急切地加载帖子。
现在,我的DBA希望使用Table Valued Functions来访问这两个集合,以便根据查询用户应用权限筛选。界面将是这样的:
IQueryable<Blog> Blogs(int userId);
IQueryable<Post> Posts(int userId);
我可以单独访问这些内容,甚至可以将一个View加入TVF,但问题是,当他们都被TVF支持时,我不能再使用EF的Include方法来热切地填充Posts集合。
问题:我需要能够查询(加入)这两个集合,并将结果集重新组合(取消)成为包含Posts集合的Blogs。解决方案还需要避免使用N+1 Selects Issue。
我意识到EF的使用并不常见,但有没有人遇到过这个问题?有没有办法使用Linq to Entities,Automapper,Store Functions或任何其他方式来做到这一点?
我正在使用带有EF Code First的Web API,Automapper的Queryable Extensions和Store Functions库来启用EF查询中的TVF。
public class Blog
{
public Blog()
{
Posts = new HashSet<Post>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public virtual Blog Blog { get; set; }
}