EF随机查询详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dongliang_shali/article/details/50705395

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

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

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

select top 1 *
from t
order 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)后再随机排序

展开阅读全文

没有更多推荐了,返回首页