/// <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 sql迁移过来的开发者,对随机排序不会感到陌生,直接为datacontext添加一个方法再配合反射就可以实现随机排序了,代码如面所示

而对于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().ToList();//只取5条
return View();
}

结果如下:

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

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

EF 随机排序的更多相关文章

  1. EF架构使用随机排序

    c#当中,可以用Random类来获取随机数 EF当中,我们写Linq时,抑或是采用Linq的扩展方法时,发现都没有随机排序的方法,这就要求我们自己去扩展了 引用自http://www.cnblogs. ...

  2. Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现

    Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 1. 应用场景 1 2. 随机抽取数据原理 1 3. 常用的实现方法:::数据库随机函数 1 4. Mssq ...

  3. JS数组随机排序

    var arr=[1,2,3,4,5]; arr.sort(function(a,b){ var v=Math.random()>0.5?1:-1; console.log(a,b,v); re ...

  4. LINQ对List列表随机排序,取N条数据

    List<Art_Search> artList=new List<Art_Search>(); artList=artList.OrderBy(s => Guid.Ne ...

  5. js实现数组内元素随机排序

    其实蛮容易实现的,关键是简洁与否,下面是我自己写的. function randomSort(a){ var arr = a, random = [], len = arr.length; for ( ...

  6. JavaScript随机排序算法1

    1.对数组循环,每一项与随机的某一项位置调换 <ul id="listOne"></ul> <div id="tempOne"&g ...

  7. List 随机排序

    List<T> l = new List<T>(); l = l.Select(a => new { a, newID = Guid.NewGuid() }).Order ...

  8. Unity中List的随机排序(乱序)

    为什么要给List排序做一个Unity限定条件呢 首先,是C#中的List泛型,若是Java,直接调用Collection.shuffle()就OK了 而Unity的C#版本较低,不能使用Random ...

  9. c++随机排序容器中的元素

    在各种程序语言中都提供了将容器元素随机排序的shuffle方法,c++也不例外. 不过c++将shuffle放在了<algorithm>中而不是像其他语言一样在random里,同时c++1 ...

随机推荐

  1. c++引用小问题!

    两段程序 string version(const string &s1,const string &s2) { string temp; temp =s2+s1+s2; return ...

  2. .net Url重写

    详细说明及下载dll源码路径: http://msdn.microsoft.com/zh-cn/library/ms972974.aspx 顺带上本人写的一个小例子:http://files.cnbl ...

  3. 华为OJ平台——求最大连续bit数

    题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: ...

  4. c++回调

    c++回调包含类函数回调和非类函数回调. 类函数回调,函数指针指向函数名称,需要带类作用域,调用时需要用到类指针. 如qt里面定义一个返回值为qbytearray的函数指针, typedef QByt ...

  5. 【Linux】inode_针对MySQL读写操作在系统层的进一步学习【转】

    转自http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘 ...

  6. C# Socket网络编程精华篇(转)

    我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本 ...

  7. 使用扩展方法(this 扩展类型)

    namespace ConsoleApp_UseExtendWays{ class Program { static void Main(string[] args) { Student s = ne ...

  8. PPTP --VPN配置

    测试:1:根据上面的步骤4,在路由器里查看状态:2:手机热点,共享给你电脑,电脑拨号,进行测试.   参考:http://jingyan.baidu.com/article/90808022ddd6a ...

  9. 0511 backlog 项目管理

    SCRUM 这次的作业就是确定SCRUM的计划,确定sprint backlog的一个冲刺周期,而这个周期是两个星期.争取在两周内发布1.0版本. 本次作业以网站构建为主: ID       NAME ...

  10. poj1936_All in All

    时间复杂度O(n) #include <stdio.h> #include <string.h> int main(){ int al,bl,i,j; +]; +]; whil ...