【问题标题】:Question about Include Method in Entity Framework关于实体框架中包含方法的问题
【发布时间】:2013-02-19 03:41:33
【问题描述】:

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

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

我的问题从这里开始:

我有一个这样的查询:

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

使用包括。 如果我删除 SelectassignedProjects 将包含此客户端的项目,但是当我包含 Select AssignedProjects 时,Select AssignedProjects 为空并且匿名对象很好,但是.. 用户不包含任何 AssignedProjects。

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

我想要的最后一个图是.. 具有 clientID 的用户在他的项目中具有集合 AssignedProjects 并创建匿名对象,用户(带有集合)和 IssuesCount 传递给视图以显示 AssignedProjects、用户信息和编号客户报告的问题..

有谁知道我该如何解决这个问题?

【问题讨论】:

  • 老实说,这可能是完全错误的,但我正在通过并认为我会试一试。尝试在包括和选择之间使用 AsQueryable()。让我知道这是否对您有任何帮助:P。

标签: asp.net-mvc entity-framework


【解决方案1】:

你可以试试这个:

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() - 它不再起作用。

【讨论】:

  • 这段代码工作得很好,但我总是需要担心这种情况(使用包含进行投影),并且在我看来,我不能使用集合指针来遍历另一个实体,因为这个问题.. 但是直到现在是更好的解决方案。
【解决方案2】:

就使用实体框架生成存储表达式而言,包含(预加载)不适用于 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(),
};

【讨论】:

  • 感谢您的回复。是的,首先我想到了那个解决方案,但我真的想要问题的数量,我不希望任何问题加载到内存中只是为了计算它们;)
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多