【问题标题】:Fill a list object with multiple tables用多个表填充列表对象
【发布时间】:2021-05-04 14:36:55
【问题描述】:

我目前有这个列表

    public static List<Tablea> AllTablesList()
     {
          using (var context = new EFContext())
         {
            return context.Tableas
                 .Include(p => p.Tablebs)
                 .ToList();
        }
    }

我想使用 Tableb 中所述的 ICollection 进行扩展,它使用表 C 中的数据。但是该列表继承自 Tablea,因此我尝试对 tablec 的所有引用都失败了。

public class Tablea : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public int TableaID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Tableb> Tablebs { get; set; }
}

public class Tableb : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public int TablebID { get; set; }
    public string Name { get; set; }

    public int TableaID { get; set; }
    public Tablea Tablea { get; set; }
    public virtual ICollection<Tablec> Tablecs { get; set; }

将集合包含在 tableb 中的最佳方式是什么?

【问题讨论】:

  • .Select(p =&gt; p) 的目的是什么?去掉返回值有什么问题?
  • @mm8 似乎是我的复制/粘贴错误,感谢您指出。删除它并相应地编辑了帖子
  • 目前还不清楚问题是什么。究竟是什么“失败”以及如何?
  • 所有Tablea 实体都在context.Tableas 中,不是吗?那么您缺少哪些实体?
  • @mm8 TableC 是它自己的实体。我要创建的列表需要来自 A 的数据,该数据在 B 中有子实体,而 B 在 C 中有子实体。该列表基于 A 并且可以使用 B 中的数据。但是我似乎无法扩展列表以包含C 也是如此,因为列表的基础仍在 A 中。我想知道实现这一目标的最佳方法是什么

标签: c# entity-framework linq


【解决方案1】:

我怀疑问题是您想要在加载 TableAs 时急切加载 TableC 和 TableB。不过,当您声明“但列表继承自 Tablea”之类的内容时,尚不清楚

return context.Tableas
    .Include(p => p.Tablebs)
    .ThenInclude(p => p.Tablecs)
    .ToList();

如果您想为每个 TableA 呈现所有 TableC 的表格(通过 TableB 引用,即您想要呈现 TableC,而不是 TableA,而是通过 TableA 加载它们:

return context.Tableas
    .SelectMany(a => a.Tablebs.SelectMany(b => b.Tablecs))
    .ToList();

虽然通常如果在 TableA 上过滤,从 C 导航回来更有意义,如果您需要其中的详细信息,则包括每个 B 和 A:

return context.Tablecs
    .Include(c => c.Tableb)
    .ThenInclude(b => b.TableA)
    .ToList();

这将返回一个 IEnumerable&lt;TableC&gt; 并急切加载每个 B 和 A 引用,而不是一个 IEnumerable&lt;TableA&gt; 并急切加载 B 和 Cs。

最终,尽管在将关系数据的层次结构呈现为视图的“平面”数据表时,我强烈建议定义一个视图模型并使用Select 来投影关系数据以仅表达来自各种实体来填充您的平面视图模型。这样做的好处是通过网络向客户端发送的数据要少得多。这将完全取决于视图需要呈现的每个相关表中的哪些数据。 (即每个“A”的一行带有 B 和/或 C 的摘要,或者每个“C”的一行带有相关 B 和 A 的详细信息...)

否则,如果需要的特定类继承/关系与 EF 冲突以获取所需数据,则需要提供重现问题的最小示例。

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 2013-04-21
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多