EF随机查询详解

来源:互联网 发布:kmp next函数算法流程 编辑:程序博客网 时间:2024/05/17 22:31

有一些业务上并不要求查询出全部数据,而是随机取出几条数据,应用场景如下:

我要从一群人当中选择1个人获得奖金,为了保证每个人的公平性,必须采用随机算法

sql语法中,我们可以这样写

select top 1 *from torder by newid()

c#当中,可以用Random类来获取随机数

EF当中,我们写Linq时,抑或是采用Linq的扩展方法时,发现都没有随机排序的方法,这就要求我们自己去扩展了

引用自http://www.cnblogs.com/lori/p/3166899.html

/// <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    }



但是,这个方法方法有个缺点,如果是Linq查询未加载的IQueryable集合,则无效,必须先加载(用ToList或ToArray)后再随机排序

0 0