根据 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 查询的结果的主要内容,如果未能解决你的问题,请参考以下文章