如何用Linq迭代以创建objets列表?

时间:2018-12-18 21:36:48

标签: c# list linq umbraco

我正在尝试使用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

我知道我想念一些东西。我为每个“一个”项目都构建了一个新的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来喂养我的Items的{​​{1}}个道具(一个List<TuileArticleModel>)...

编辑:

我认为我只是通过将其暴露给大家并阅读评论来解决了我的问题。所以我这样做了:

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();

2 个答案:

答案 0 :(得分:1)

首先获取结果集:

Assn

然后将其传递到新对象中:

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()
    };

答案 1 :(得分:0)

Group

代替

.ToList()

要注意的另一件事是

.FirstOrDefault()

这将返回一个IQueriable,尚未完成任何处理,您刚刚为其创建了查询。

调用ToList将执行IQueriable并将结果作为列表返回。