如何使用Linq迭代创建对象列表?

问题描述 投票:0回答:2

我正在尝试使用Linq从列表中进行迭代以创建并返回模型,其中包含项目列表和总项目数量。

必须返回的对象如下:

public class ListeArticlesModel
    {        
        public List<TuileArticleModel> Items { get; set; }

        public int Quantity { get; set; }

    }

我现在坚持这个:

result.Actualites = tousLesArticlesFromDb
                .ToList()
                .Where(
                    a => a.GetPropertyValue<IEnumerable<IPublishedContent>>("ficheArticle_typeDeContenu")
                             .FirstOrDefault()?.Name == @EnumResources.TypeDeContenu_Actualites)
                .OrderBy(a => a.CreateDate)
                .Take(criteriaModel.NbrItemsParPage)
                .Select(
                    a => new ListeArticlesModel
                    {
                        Items = new List<TuileArticleModel>
                        {
                            // returns a TuileArticleModel 
                            getItem(a)
                        },
                    })
                .FirstOrDefault();

这不是我想要的。如果我删除.FirstOrDefault(),我得到一个IEnumerable

我知道我错过了什么。我正在为每个“a”项目构建一个新的ListeArticleModel,然后我只需要构建第一个,但我不知道如何离开这里......

(ps:我几周前毕业。我是C#的新手。我知道这可能是基础知识。我正在努力学习它们:D)

我试过这个:

var actus = tousLesArticlesFromDb
                    .ToList()
                    .Where(
                        a => a.GetPropertyValue<IEnumerable<IPublishedContent>>("ficheArticle_typeDeContenu")
                                 .FirstOrDefault()?.Name == @EnumResources.TypeDeContenu_Actualites)
                    .OrderBy(a => a.CreateDate)
                    .Take(criteriaModel.NbrItemsParPage);

这给了我一个IEnumerable(在这里使用umbraco),其中包含我想要的类型为“Actualites”的criteriaModel.NbrItemsParPage IPublishedContent项目...

现在,每个我想创建一个新的TuileArticleModel来喂我的ItemsList<TuileArticleModel> proptery(一个result.Actualites)......

编辑:

我想我刚解决了我的问题,把它暴露给你们,并阅读评论。所以我这样做了:

 var actus = tousLesArticlesFromDb
                    .ToList()
                    .Where(
                        a => a.GetPropertyValue<IEnumerable<IPublishedContent>>("ficheArticle_typeDeContenu")
                                 .FirstOrDefault()?.Name == @EnumResources.TypeDeContenu_Actualites)
                    .Take(criteriaModel.NbrItemsParPage);

                result.Actualites.Items = actus.Select(a => {return getItem(a); }).ToList();

或在一个声明中:

  result.Actualites = new ListeArticlesModel
                {
                    Items = tousLesArticlesFromDb
                            .Where
                            (
                                a => a.GetPropertyValue<IEnumerable<IPublishedContent>>("ficheArticle_typeDeContenu")
                                         .FirstOrDefault()?.Name == @EnumResources.TypeDeContenu_Actualites
                            )
                            .OrderBy(a => a.CreateDate)
                            .Take(criteriaModel.NbrItemsParPage)
                            .Select(a => { return getItem(a); }).ToList(),
                };
c# list linq umbraco
2个回答
1
投票

首先获取结果集:

var results = tousLesArticlesFromDb
    .Where
    (
        a => a.GetPropertyValue<IEnumerable<IPublishedContent>>("ficheArticle_typeDeContenu")
              .FirstOrDefault()?.Name == @EnumResources.TypeDeContenu_Actualites
    )
    .OrderBy(a => a.CreateDate)
    .Take(criteriaModel.NbrItemsParPage);

然后将其传递给新对象:

result.Actualites = new ListeArticlesModel
    {
        Items = results.ToList()
    };

或者,如果您想在一个声明中完成所有操作:

result.Actualites = new ListeArticlesModel
{
    Items = tousLesArticlesFromDb
        .Where
        (
            a => a.GetPropertyValue<IEnumerable<IPublishedContent>>("ficheArticle_typeDeContenu")
                  .FirstOrDefault()?.Name == @EnumResources.TypeDeContenu_Actualites
        )
        .OrderBy(a => a.CreateDate)
        .Take(criteriaModel.NbrItemsParPage);
        .ToList()
};      

0
投票
.ToList()

代替

.FirstOrDefault()

另一件需要注意的事情是

tousLesArticlesFromDb
                .Where( *** )
                .OrderBy(a => a.CreateDate)
                .Take(criteriaModel.NbrItemsParPage)
                .Select(
                    a => new ListeArticlesModel
                    {
                        Items = new List<TuileArticleModel>
                        {
                            // returns a TuileArticleModel 
                            getItem(a)
                        },
                    })

这将返回IQueryable,尚未完成任何处理,您刚刚为它创建了查询。

调用ToList将执行IQueryable并将结果作为List返回。

© www.soinside.com 2019 - 2024. All rights reserved.