Как перебрать с Linq, чтобы создать список объектов? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь выполнить итерацию из списка с помощью 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 для каждого элемента "а", а затем я просто беру первый построенный, но я не вижу, как выбраться отсюда ...

(пс: я закончил нескольконедель назад. Я новичок в 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), который содержит элементы criteriaModel.NbrItemsParPage IPublishedContent типа "Actualites", которые я хочу ...

Теперь для каждого я хотел бы создать новый TuileArticleModel для подачи Itemsproptery (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();

или одним утверждением:

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

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Сначала получите набор результатов:

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 голосов
/ 19 декабря 2018
.ToList()

вместо

.FirstOrDefault()

Еще одна вещь, на которую следует обратить внимание:

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

Это вернет IQueriable, обработка еще не была выполнена, вы только что создализапрос для него.

Вызов ToList выполнит IQueriable и вернет результат в виде списка.

...