LINQ - 返回随机值不起作用

本文关键字:不起作用 随机 返回 LINQ | 更新日期: 2023-09-27 18:35:26

我的基础设施中有这个类,它假设返回随机图像。它始终返回相同的图像。我在我的网站上的不同位置使用了完全相同的代码,它可以工作。有什么想法吗?

这个问题是我从哪里获得获取随机值的信息。我不明白为什么它在一个地方工作而不是另一个地方......

背景.cs

public static class Background
{
    public static string Get()
    {
        photoBlogModelDataContext _db = new photoBlogModelDataContext();
        var image = _db.Images.OrderBy(x => Guid.NewGuid()).FirstOrDefault();
        return image.Small; // Always same value?
    }
}

在另一个页面上工作的相同代码,我循环浏览我的画廊并从中选择随机图像

<img src="@Url.Content("~/content/uploads/" + item.Images.OrderBy(x => Guid.NewGuid()).FirstOrDefault().Small)" alt="" />

LINQ - 返回随机值不起作用

Guid 不是随机数。 它们通常是顺序的,因为它们具有时间戳组件,这意味着您将始终从该代码中获取第一个或最后一个图像。 您应该使用 Random 类(如果它真的很重要,则使用加密随机数生成器之一)获取一个介于 0 和您拥有的图像数量之间的随机数,然后获取第 n 个图像(其中 n 是随机数)。 如果在短时间内多次调用此函数,则应确保在对该方法的所有调用之间使用相同的Random实例。 (这意味着创建一个您可以重复使用的私有静态随机实例。

好吧,我会说一次你有linq2entities,一次linq2object

不确定 OrderBy(Guid.NewGuid()) 的工作方式是否相同。

如果您尝试枚举

public static class Background
{
    public static string Get()
    {
        photoBlogModelDataContext _db = new photoBlogModelDataContext();
        var image = _db.Images.ToList().OrderBy(x => Guid.NewGuid()).FirstOrDefault();
        return image.Small; // Always same value?
    }
}

它应该改变。

有什么

理由不能像下面这样使用System.Random类吗?

var random = new Random();
var index = random.Next(0, count); // use the list count here
var randomImage = _db.Images[index]; // or equivalent