根据 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();
我正在使用 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();