如何使用 Linq 进行迭代以创建对象列表?
how to iterate with Linq to create list of objets?
我正在尝试使用 Linq 从列表中迭代以创建和 return 一个模型,其中包含项目列表和总项目数量。
必须return编辑的对象如下:
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),其中包含我想要的 criteriaModel.NbrItemsParPage
IPublishedContent 类型 "Actualites" 项目...
现在,我想为每个人创建一个新的 TuileArticleModel
来满足我 result.Actualites
的 Items
属性(一个 List<TuileArticleModel>
)...
编辑:
我想我只是通过向你们展示它并阅读评论来解决我的问题。所以我这样做了:
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(),
};
.ToList()
而不是
.FirstOrDefault()
还有一点需要注意的是
tousLesArticlesFromDb
.Where( *** )
.OrderBy(a => a.CreateDate)
.Take(criteriaModel.NbrItemsParPage)
.Select(
a => new ListeArticlesModel
{
Items = new List<TuileArticleModel>
{
// returns a TuileArticleModel
getItem(a)
},
})
这将 return 一个 IQueryable
,尚未完成任何处理,您刚刚为其创建了查询。
调用 .ToList()
将执行 IQueryable
和 return 结果作为列表。
先获取结果集:
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()
};
我正在尝试使用 Linq 从列表中迭代以创建和 return 一个模型,其中包含项目列表和总项目数量。
必须return编辑的对象如下:
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),其中包含我想要的 criteriaModel.NbrItemsParPage
IPublishedContent 类型 "Actualites" 项目...
现在,我想为每个人创建一个新的 TuileArticleModel
来满足我 result.Actualites
的 Items
属性(一个 List<TuileArticleModel>
)...
编辑:
我想我只是通过向你们展示它并阅读评论来解决我的问题。所以我这样做了:
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(),
};
.ToList()
而不是
.FirstOrDefault()
还有一点需要注意的是
tousLesArticlesFromDb
.Where( *** )
.OrderBy(a => a.CreateDate)
.Take(criteriaModel.NbrItemsParPage)
.Select(
a => new ListeArticlesModel
{
Items = new List<TuileArticleModel>
{
// returns a TuileArticleModel
getItem(a)
},
})
这将 return 一个 IQueryable
,尚未完成任何处理,您刚刚为其创建了查询。
调用 .ToList()
将执行 IQueryable
和 return 结果作为列表。
先获取结果集:
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()
};