【问题标题】:LINQ : How to set value of Take() from a field in current queryLINQ:如何从当前查询中的字段设置 Take() 的值
【发布时间】:2015-08-03 08:52:36
【问题描述】:

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

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

姓名 |数数 --------------------- 近期新闻 | 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();

在每个 Widget 部分视图中:

    foreach(var p in Model.PostsInRecentNews)
    {
        <li>@Html.ActionLink(p.Post.Title,"Index","Home")</li>
    }

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

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

感谢您的帮助...

【问题讨论】:

    标签: linq take


    【解决方案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 是某个地方的字段,当然 - 根据您的要求进行调整。)

    【讨论】:

    • 谢谢@Jon Skeet,我将使用第二种方法,但是有没有办法获取每个小部件需要在 postInWidgets 的主查询中显示的帖子的 Top(Count)?然后把所有的postsInRecentNews等…
    • @Hamed:我不确定我理解你的意思——你是在问是否可以执行单个查询来检索每种小部件类型的正确数量?我怀疑不是。
    • 您的答案与我一直在寻找的答案相同,但我更喜欢使用单个查询来检索每个小部件所需的每个帖子的正确数量。对不起我的英语......
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多