【问题标题】:Use LINQ to Access All the Collections of a Collection on My Model?使用 LINQ 访问我的模型上的集合的所有集合?
【发布时间】:2013-05-09 22:55:34
【问题描述】:

我正在尝试在我的模型上编写一个属性,只有一个 get 访问器可以返回一个集合,该集合由集合属性的每个成员包含的所有集合组成。

所以:

Document.Lines 是 Line 对象的集合。每一行都与称为相关文档的文档具有多对多关系。我希望能够从文档中的每一行访问所有相关文档的集合。有没有办法在 Linq/EF 中做到这一点?

我正在尝试在模型中不创建 dbContext 对象的情况下执行此操作。

长格式应该是这样的:

  public List<RelatedDocument> RelatedDocuments
        {
            get
            {
                var RDs = new List<RelatedDocument>();
                foreach (var line in Lines)
                {
                    foreach (var rd in line.RelatedDocuments)
                    {
                        if (!RDs.Contains(rd))
                        {
                            RDs.Add(rd);
                        }
                    }
                }
                return RDs;
            }
        }

【问题讨论】:

  • 你打算如何在没有 DataContext 的情况下与 DB 通信?
  • EF 通常需要一个 DBContext。您是否打算保留这些集合?
  • 我是模特。我可以访问 Lines 集合的属性,但由于我在模型中,所以我无法访问 SelectMany 之类的东西。我可能可以以长形式遍历集合并构建一个列表,但希望有一个更优雅的基于 linq 的解决方案。
  • 如果它是IEnumerable&lt;T&gt; 集合,您确实可以访问SelectMany
  • 这是一个列表。我在上面编辑了我想要实现的目标。

标签: asp.net-mvc linq entity-framework asp.net-mvc-4


【解决方案1】:

我不太确定问题出在哪里;如果LinesIEnumerable&lt;T&gt; using System.Linq),那么就不会像

var allRelated = Lines
  .SelectMany(line => line.RelatedDocuments)
  .Distinct();

够了吗?

当然,Lines 本身必须来自某个地方..

【讨论】:

  • 这看起来很有希望。我认为我的问题是我需要导入命名空间 System.Linq。由于我在 Model 类中,并且在不处理数据访问的命名空间中,IntelliSense 向我显示这些方法不可用
  • @YHaber 是的,使用 LINQ 扩展方法是一项要求(在我的回答中添加了该注释)。考虑尝试 ReSharper - 对于商业来说便宜,对于非商业来说是免费的 - 因为它会对此类错误执行漂亮的“自动建议导入”。我的回答的一个潜在问题是Distinct does not guarantee ordering
  • 我正在使用 reSharper。这就是为什么,当我尝试你的代码时,我得到了导入的建议!在我根据智能感知中可用的方法做出假设之前。我觉得我应该可以选择很多,但它不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2023-01-27
  • 1970-01-01
相关资源
最近更新 更多