根据 SessionID 打乱 LINQ 查询的结果

Shuffle the results of a LINQ query based on SessionID

我正在使用 Entity Framework 6 和 SQL 服务器数据库开发 ASP.NET MVC 应用程序。

我试图通过添加一个 SortingCode 来打乱查询结果,我想根据当前的 SessionId 分配一个值,这样每次返回的行在不影响分页的情况下进行洗牌。 SortingCode 在这个尝试中是一个字符串,但它可以是任何类型,只要它能让我得到打乱的结果。我有这样的东西:

var sessionId = Session.SessionID.GetHashCode();
var rnd = new Random(sessionId);

var query = (from l in _context.Adverts
             select new AdvertSummary
             {
                 Id = l.Id,
                 Title = l.Title,
                 Description = l.Description,
                 SortingCode = l.Title.OrderBy(x => rnd.Next()).ToString(),
             });

IQueryable 结果稍后在我的代码中转换为列表:

var pagedResults = query.Skip(skip).Take(pageSize).ToList();

上述 Random class 的尝试无效,并导致错误

DbExpressionBinding requires an input expression with a collection ResultType

我可以做些什么来获得随机结果?

我建议使用 SqlFunctions.Checksum 来完成这样的任务。 SortingCode 将接近种子随机。

var sessionId = Session.SessionID;

var query = 
    from l in _context.Adverts
    select new AdvertSummary
    {
        Id = l.Id,
        Title = l.Title,
        Description = l.Description,
        SortingCode = SqlFunctions.Checksum(sessionId, l.Title)
    };

var pagedResults = query
    .OrderBy(x => x.SortingCode)
    .ThenBy(x => x.Id)
    .Skip(skip)
    .Take(pageSize)
    .ToList();