zoukankan      html  css  js  c++  java
  • EF架构~linq to entity的随机排序问题

    回到目录

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

    回到目录

  • 相关阅读:
    Django配置MySQL数据库教程
    给大家发个Python和Django的福利吧,不要钱的那种~~~
    Django 设置admin后台表和App(应用)为中文名
    Django 配置JWT认证方式
    威联通(NAS)应用篇:自建OwnCloud网盘(百度网盘,拜拜~~~)
    请不要浪费你的生命,一文多发推广就用它(OpenWrite)
    Django ORM 查询表中某列字段值
    【Django 2.2文档系列】Model 外键中的on_delete参数用法
    嵌入式、C语言位操作的一些技巧汇总
    【RT-Thread笔记】IO设备模型及GPIO设备
  • 原文地址:https://www.cnblogs.com/lori/p/3166899.html
Copyright © 2011-2022 走看看