【问题标题】:Randomize entity framework query results随机化实体框架查询结果
【发布时间】:2011-07-12 04:11:31
【问题描述】:

下午好,

我有一个使用 linqdatasource + 实体框架 iqueryable 查询填充的列表视图。

查询使用了一个 take(t-sql 上的顶部),如下所示:

context.Categories().OrderBy(c=>c.Name).Take(20);

所以它给我带来了我想要按名称排序的 20 条记录。

现在我想按随机顺序显示这 20 条记录。完成此任务的最佳方法是什么?

【问题讨论】:

    标签: asp.net entity-framework


    【解决方案1】:

    我相信这篇文章中的答案就是你所需要的:

    Linq to Entities, random order

    编辑:

    首先获取您的前 20 条记录。然后使用您已经获取的前 20 个项目,在 C# 中将它们全部随机化,完全不涉及数据库:

    var yourRecords = context.Categories().OrderBy(c=>c.Name).Take(20); // I believe .Take() triggers the actual database call
    yourRecords = yourRecords.OrderBy(a => Guid.NewGuid()); // then randomize the items now that they are in C# memory
    

    【讨论】:

    • 嗨,谢谢你的回答,但这不是我需要的,因为它会从整个数据库表中检索我 20 条随机记录,我想从数据库中获取 20 条顶级记录,然后显示 20随机顺序记录
    • 这是一个很好且合乎逻辑的答案,它只是将我的 linqdatasource 排除在场景之外。你认为它可以在 DB 上完成吗?就像你在 TSQL 上做这个 select * from (select top 20 * from Categories order by Name) as Subquery order by NewGuid
    • 是的,这也绝对有可能。 ORDER BY NEWID() 是它的 T-SQL:codekeep.net/snippets/1687fcea-5f5b-4c6d-b9d3-bd049667d2e1.aspx 我假设您可以包装原始查询,然后在外部查询中按 newid() 排序。
    • 嗨(抱歉耽搁了),我已经用扩展方法解决了(linq to entity),请看我的回答,谢谢
    【解决方案2】:

    结果证明,使用扩展方法非常简单,首先按名称排序,然后调用 Take(T-sql 上的顶部),然后再随机化

            context.Categories().OrderByName().Take(20).OrderByRandom();
    
    
            public static IQueryable<Category> OrderByName(this IQueryable<Category> query)
            {
                    return from c in query
                            orderby c.Name
                            select c;
            }
    
    
    
            public static IQueryable<T> OrderByRandom<T>(this IQueryable<T> query)
            {
                    return (from q in query
                            orderby Guid.NewGuid()
                            select q);
            }
    

    【讨论】:

    • 这可以使用没有扩展方法的纯 lambda 表达式,但我没有测试过
    • 酷,很高兴你能成功。是否需要尝试/捕获?如果他们所做的只是抛出异常,那不是没有他们的默认行为吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多