LINQ - 返回随机值不起作用

时间:2012-05-24 17:13:16

标签: c# asp.net

我的基础架构中有这个类,它假设返回随机图像。它总是返回相同的图像。我在我的网站上的不同位置使用完全相同的代码,它的工作原理。有什么想法吗?

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

Background.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="" />

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

好吧,我会说有一次你有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?
    }
}

它应该改变。

答案 2 :(得分:0)

您是否有理由不能使用下面的System.Random类?

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