您的位置:首页 > 运维架构 > 网站架构

EF架构~linq to entity的随机排序问题

2013-07-02 14:21 405 查看
回到目录

对于从linq to sql迁移过来的开发者,对随机排序不会感到陌生,直接为datacontext添加一个方法再配合反射就可以实现随机排序了,代码如下:

/// <summary>
/// 数据上下文扩展
/// </summary>
public partial class dbDataContext : IUnitOfWork
{
/// <summary>
/// 随机排序时使用这个函数
/// </summary>
/// <returns></returns>
[Function(Name = "NewID", IsComposable = true)]
public Guid NewID()
{
return ((Guid)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))).ReturnValue));

}
}


而对于linq to entity的开发者们就不能使用上面的方法了,因为dbcontext没有ExecuteMethodCall这个方法,呵呵,只有自己想辙了,事实上,对于system.Data.Entity空间里有一个EdmFunction的特性,它与linq to sql里的Function特性类似,都是标识类为函数,就是使用数据源的某个函数,如Sqlserver的newid函数,我们可以把它思路整理一下,代码就出来了,我们像它种与领域无关的代码放在core项目里,表示为公用代码

/// <summary>
/// sql函数的扩展类
/// </summary>
public static class SqlFunctionExtensions
{
/// <summary>
/// 在linq to entity中使用SqlServer.NEWID函数
/// </summary>
[System.Data.Objects.DataClasses.EdmFunction("SqlServer", "NEWID")]
public static Guid NewId()
{
return Guid.NewGuid();
}
}


而为了使开发者在使用上方法,我们把NewId作成IEnumerable接口的扩展方法,这样无论是IQueryable还是IList,List集合都可以直接使用它了,看代码

/// <summary>
/// sql函数的扩展类
/// </summary>
public static class SqlFunctionExtensions
{
#region 功能方法
/// <summary>
/// 在linq to entity中使用SqlServer.NEWID函数
/// </summary>
[System.Data.Objects.DataClasses.EdmFunction("SqlServer", "NEWID")]
public static Guid NewId()
{
return Guid.NewGuid();
}
#endregion

#region 扩展方法
/// <summary>
/// 随机排序扩展方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static IQueryable<T> OrderByNewId<T>(this IEnumerable<T> source)
{
return source.AsQueryable().OrderBy(d => NewId());
}
#endregion

}


而使用了IEnumerable的集合扩展后,它是否还有延时加载的特性,通过我们的检测,答案是肯定的,它是延时的,下面是我们的例子

public ActionResult Index()
{
var list = irepository.GetEntities();
ViewBag.List = list.OrderByNewId().Take(5).ToList();//只取5条
return View();
}


结果如下:



而进行数据库检测的结果,出是令我们满意的,只取了5条数据



OK,到这种使用linq to entity(entity frameworks环境下)的随机排序就介绍到这里,谢谢阅读!

回到目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: