使用C#从几个相同类型的不同列表创建一个列表

时间:2013-05-08 11:30:39

标签: c# arrays asp.net-mvc-3 linq list

我正在开发一个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可以是HeaderDrawingBodyFooter。所以我希望能够分离这些部分,因为我对每种内容类型都有部分视图。所以我这样做了:

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>

2 个答案:

答案 0 :(得分:3)

你可以像这样使用concat函数

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

答案 1 :(得分:2)

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

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

我强烈建议不要使用ToList()。请改用AsEnumerable()。每个.ToList()循环Collection,而使用AsEnumerable()只循环一次。