【发布时间】:2011-07-12 04:11:31
【问题描述】:
下午好,
我有一个使用 linqdatasource + 实体框架 iqueryable 查询填充的列表视图。
查询使用了一个 take(t-sql 上的顶部),如下所示:
context.Categories().OrderBy(c=>c.Name).Take(20);
所以它给我带来了我想要按名称排序的 20 条记录。
现在我想按随机顺序显示这 20 条记录。完成此任务的最佳方法是什么?
【问题讨论】:
下午好,
我有一个使用 linqdatasource + 实体框架 iqueryable 查询填充的列表视图。
查询使用了一个 take(t-sql 上的顶部),如下所示:
context.Categories().OrderBy(c=>c.Name).Take(20);
所以它给我带来了我想要按名称排序的 20 条记录。
现在我想按随机顺序显示这 20 条记录。完成此任务的最佳方法是什么?
【问题讨论】:
我相信这篇文章中的答案就是你所需要的:
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
【讨论】:
结果证明,使用扩展方法非常简单,首先按名称排序,然后调用 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);
}
【讨论】: