关于实体框架中包含方法的问题

时间:2011-07-05 19:21:51

标签: asp.net-mvc entity-framework

我正在asp.net MVC上创建一个网站,我正在使用存储库接口在内存中使用存储库并使用数据库。

我已经修好了所有关系,我的意思是例如当我有一个联系人而不是他有地址时,所以..当我向这个联系人添加一个地址时自动修复address.contact指向联系人的关系,我将实体框架的属性虚拟化,然后使用数据库存储库创建代理。

我的问题从这里开始:

我有一个这样的查询:

return query.Where(c => c.UserID == clientId)
                         .Include(c => c.AssignedProjects)
                         .Select(c => new UserDetailsData<Client>
                         {
                             User = c,
                             IssuesCount = c.IssuesReported.Count()
                         }).Single();

使用include。 如果我删除Select assignedProjects将包含此客户端的Projects,但是当我包含Select AssignedProjects时为null且匿名对象很好但是..用户不包含任何AssignedProjects。

在内存中我可以做到这一点,但使用EF我不能。

我想要的最终图是..具有clientID的用户具有他的项目的集合AssignedProjects并创建匿名对象与User(带有集合)和IssuesCount传递到视图以显示AssignedProjects,用户信息和数字客户报告的问题..

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

就使用Entity Framework生成商店表达式而言,Include(预先加载)不能与Select(投影)一起使用。

您可以找到更多信息If I select from an IQueryable then the Include is lost,同时您也可以看到相关工作。

我不确定列出的工作是否会在你的情况下有效,因为你的投影有多个回报(而不是预期的对象)。

既然您说除了执行实际计数之外您最终的图表是什么,为什么不把它变成:

var user = query.Where(c => c.UserID == clientId)
    .Include(c => c.AssignedProjects)
    .Include(c => c.IssuesReported)
    .Single();

var userDetailsData = new UserDetailsData<Client>()
{
    User = user,
    IssuesCount = user.IssuesReported.Count(),
};

答案 1 :(得分:0)

你可以试试这个:

return query.Where(c => c.UserID == clientId)
            .Select(c => new UserDetailsData<Client>
            {
                User = c,
                AssignedProjects = c.AssignedProjects,
                IssuesCount = c.IssuesReported.Count()
            }).Single();

虽然您对项目类型的AssignedProjects属性不感兴趣,但它也会填充User.AssignedProjects属性。这利用了“关系跨度”,这是EF中的一项功能,可自动构建加载到上下文中的对象的导航属性。

请注意,这实际上依赖于将对象加载到上下文中的事实。如果您停用跟踪功能 - 例如在查询中使用AsNoTracking() - 它就不再有效了。