1

我有一个包含“名称”和“计数”列的小部件表

“计数”字段包含每个小部件将显示的帖子数:

姓名 | 数数
---------------------
近期新闻 | 6
特别新闻 | 5
新闻图库 | 10

与 Widgets Table 和 Posts Table 关联的第二个表:

邮政编码 | 小部件ID
------------------
100 | 6
101 | 5
102 | 10

为了获得更高的性能,我只需通过此查询为每个小部件获取最后需要的帖子:

            var postInWidgets = db.PostWidgets
                .GroupBy(pw => pw.WidgetID)
                .SelectMany(g => g.OrderByDescending(p => p.Post.DateCreated).Take(500))
                .ToList();

然后在每个小部件中获取帖子:

            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>
    }

我的问题:如何为每个小部件而不是 Take(6) 、 Take(5) 、 Take(10) 动态设置 Take(count) 的 int 值...

我想我需要使用 TakeWhile() 而不是 Take()

感谢您的任何帮助...

4

1 回答 1

1

听起来您只需要先获取计数(您可能想要缓存它们):

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

您可能会使用枚举而不是字符串,以避免使用易于输入的字符串常量。如果枚举具有相关小部件 ID 的值,则可以将其包装在一个方法中:

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

(这假设counts是某个地方的字段,当然 - 根据您的要求进行调整。)

于 2015-08-03T08:59:33.287 回答