【问题标题】:Shuffle the results of a LINQ query based on SessionID根据 SessionID 随机播放 LINQ 查询的结果
【发布时间】: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 进行排序。

标签: asp.net-mvc linq pagination shuffle


【解决方案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; } `
猜你喜欢
  • 2016-05-21
  • 2011-05-30
  • 1970-01-01
  • 2010-12-11
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2021-12-05
相关资源
最近更新 更多