1

我正在开发一个 asp.net mvc 3 应用程序。我正在使用 LINQ 从数据库中获取数据:

 public object GetFieldsForDocument()
        {
            DocumentFieldsRepository.Context = FieldsRepository.Context;

            var model = DocumentFieldsRepository.All()
                    .Join(FieldsRepository.All(),
                        df => df.FieldId,
                        f => f.Id,
                        (df, f) => df).ToList();
            return model;
        }

然后在我的控制器中我有这个:

List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldsService.GetFieldsForDocument();
            model = model.Where(x => x.DocumentId == 10005)
                .OrderBy(x => x.ContentTypeId)
                .ThenBy(x => x.RowNo)
                .ThenBy(x => x.ColumnNo)
                .ToList();

我知道可以通过将 ID 传递给GetFieldsForDocument()方法来避免这种情况,但现在还处于早期阶段,现在我只想让事情正常进行。

所以......现在我拥有MCS_DocumentFields给定 Id 的实体的所有数据,我想将数据分开,因为它在从视图中呈现时在逻辑上是分开的。我的财产ContentType可以是Header, Drawing, Body, Footer. 所以我希望能够分离这些部分,因为我对每种内容类型都有部分视图。所以我做了这个:

var headerItems = model.Where(c => c.ContentTypeId == 1).GroupBy(c => c.RowNo).ToList();
            var drawItem = model.Where(d => d.ContentTypeId == 2).ToList();
            var bodyItems = model.Where(b => b.ContentTypeId == 3).GroupBy(b => b.RowNo).ToList();
            var footerItems = model.Where(f => f.ContentTypeId == 4).ToList();

但现在我需要将它组合到一个类型的数据结构中,MCS_DocumentFields以便我可以将它传递给我的视图,然后从带有 foreach 语句的视图中使用我的部分视图显示数据。

我不确定如何将这四个部分完全结合在一起,以保持不同部分之间的分离。

现在 Visual Studio 显示这四个var变量的类型IGrouping<Int32, MCS_DocumentFields>

4

2 回答 2

2

你可以像这样使用 concat 函数

var MCS_DocumentFields = headerItems.Concat(drawItem)
                                .Concat(bodyItems)
                                .Concat(footerItems)
                                .ToList();
于 2013-05-08T11:34:36.277 回答
2

我会改用 Union,但您可以通过添加“SelectMany(i=>i)”来使用上面的 Concat 方法:

var MCS_DocumentFields = headerItems.SelectMany(i => i)
                            .Concat(drawItem)
                            .Concat(bodyItems.SelectMany(i => i))
                            .Concat(footerItems)
                            .ToList();

我强烈建议不要使用 ToList()。请改用 AsEnumerable()。每个 .ToList() 循环集合,并且使用 AsEnumerable() 你只循环一次。

于 2013-05-08T11:53:28.863 回答