根据 SessionID 随机播放 LINQ 查询的结果

Posted

技术标签:

【中文标题】根据 SessionID 随机播放 LINQ 查询的结果【英文标题】:Shuffle the results of a LINQ query based on SessionID 【发布时间】:2021-12-18 02:41:36 【问题描述】:

我正在使用 Entity Framework 6 和 SQL Server 数据库开发 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 类的尝试不起作用,并导致错误

DbExpressionBinding 需要一个带有集合 ResultType 的输入表达式

我可以做些什么来获得洗牌的结果?

【问题讨论】:

什么是_repository.MyTable()l.Title.OrderBy(x => rnd.Next()).ToString() 应该产生什么? EF?哪个版本? 非常感谢您的关注。我已经更新了帖子,希望现在更清楚了。 有sort randomly的解决方案,但我也不明白你为什么要对Title的字符进行排序。 @SvyatoslavDanyliv 您链接的帖子中的解决方案使用something.OrderBy(r => Guid.NewGuid()).Take(5)。 Guid.NewGuid() 在分页中不起作用,因为每次更改页面时都会重新创建顺序。我需要在滚动页面时保持相同的顺序。这就是为什么我需要基于 SessionID 进行排序。 【参考方案1】:

我建议将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();  

【讨论】:

Svyatoslav,它成功了,非常感谢!我还必须在我的 Global.asax.cs 中添加一个更改,如 here 所述,因为我的 SessionID 在每次请求时都在更改:` protected void Session_Start(Object sender, EventArgs e) Session["init"] = 0; `

以上是关于根据 SessionID 随机播放 LINQ 查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

Linq 查询根据日期和优先级获取不同的对象

linq-sql中根据时间倒序查询怎么写?

根据需要在LINQ查询分配对象中设置日期格式

开启sission机制

Linq 查询 - 根据第一个字母 b/w 两个范围查找字符串

如何使用 Linq 根据用户属于另一个表的位置来查询表