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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

对于从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环境下)的随机排序就介绍到这里,谢谢阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~linq to entity的随机排序问题,如需转载请自行联系原博主。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
4月前
|
SQL 分布式计算 MaxCompute
云架构数据倾斜问题之排序优化中的CLUSTER BY如何解决
云架构数据倾斜问题之排序优化中的CLUSTER BY如何解决
|
SQL 中间件 关系型数据库
MyCat-架构剖析-核心技术之数据汇聚与排序实现 | 学习笔记
快速学习 MyCat-架构剖析-核心技术之数据汇聚与排序实现
MyCat-架构剖析-核心技术之数据汇聚与排序实现 | 学习笔记
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
251 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
241 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
|
Cloud Native 架构师
|
存储 开发框架 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
- 连接字符串 - 异步编程 - 日志 - DbContext池 - 类和配置表 - 属性和列配置 - 并发token - 索引
307 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
- ORM - Repository 仓储 - UnitOfWork 工作单元 - DB Context 与 DB Set - EF Core快速开始示例
290 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记