LINQ:如何从当前查询中的字段设置Take()的值
我有一个包含“Name”和“Count”列的小部件表 “Count”字段包含每个小部件显示的帖子数: Name | Count --------------------- RecentNews | 6 SpecialNews | 5 NewsGallery | 10 然后在每个小部件中获取帖子:LINQ:如何从当前查询中的字段设置Take()的值,linq,take,Linq,Take,我有一个包含“Name”和“Count”列的小部件表 “Count”字段包含每个小部件显示的帖子数: Name | Count --------------------- RecentNews | 6 SpecialNews | 5 NewsGallery | 10 然后在每个小部件中获取帖子: var postsInGalery = postInWidgets .Where(wid => wid.
var postsInGalery = postInWidgets
.Where(wid => wid.WidgetID == 1).Take(6)
.ToList();
var postsInSpecialNews=postInWidgets
.Where(wid => wid.WidgetID == 2).Take(5)
.ToList();
var postsInRecentNews=postInWidgets
.Where(wid => wid.WidgetID == 5).Take(10)
.ToList();
在每个小部件部分视图中:
foreach(var p in Model.PostsInRecentNews)
{
<li>@Html.ActionLink(p.Post.Title,"Index","Home")</li>
}
foreach(Model.PostsInRecentNews中的var p)
{
@ActionLink(p.Post.Title,“索引”,“主页”)
}
我的问题:如何为每个小部件动态设置Take(count)的int值,而不是Take(6)、Take(5)、Take(10)
我想我需要使用TakeWhile()来代替Take()
感谢您的帮助……听起来您只需要先获取计数(您可能需要缓存计数): 您可能会使用枚举而不是字符串,以避免使用容易键入的字符串常量。如果枚举具有相关小部件ID的值,则可以将其封装在单个方法中:
List<Widget> GetWidgets(WidgetType widgetType)
{
return postInWidgets.Where(wid => wid.WidgetID == (int) widgetType)
.Take(counts[widgetType])
.ToList();
}
(这假设
counts
是某个字段,当然-根据您的要求进行调整。)谢谢@Jon Skeet,我将使用第二种方法,但是有没有办法获得每个小部件需要在PostnWidget的主查询中显示的帖子的顶部(计数)?然后把所有的内容都放进postsInRecentNews等等。@Hamed:我不确定我是否理解你的意思-你是在问你是否可以执行一个查询来检索每个小部件类型的正确编号?我怀疑不是。你的答案和我一直在寻找的答案是一样的,但我更喜欢用一个查询来检索每个小部件需要的每个帖子的正确数量。对不起,我的英语。。。
foreach(var p in Model.PostsInRecentNews)
{
<li>@Html.ActionLink(p.Post.Title,"Index","Home")</li>
}
var counts = db.Counts.ToDictionary<string, int>(c => c.Name, c => c.Count);
var postsInGallery = postInWidgets
.Where(wid => wid.WidgetID == 1)
.Take(counts["NewsGallery"])
.ToList();
var postsInSpecialNews = postInWidgets
.Where(wid => wid.WidgetID == 2)
.Take(counts["SpecialNews"])
.ToList();
var postsInRecentNews = postInWidgets
.Where(wid => wid.WidgetID == 5)
.Take(counts["RecentNews"])
.ToList();
List<Widget> GetWidgets(WidgetType widgetType)
{
return postInWidgets.Where(wid => wid.WidgetID == (int) widgetType)
.Take(counts[widgetType])
.ToList();
}
var postsInGallery = GetWidgets(WidgetType.NewsGallery);
var postsInSpecialNews = GetWidgets(WidgetType.SpecialNews);
var postInRecentNews = GetWidgets(WidgetType.RecentNews);