2012-05-24 62 views
1

我在我的基础设施中有这个类,它假设返回随机图像。它总是返回相同的图像。我在我的网站上有不同的地方使用完全相同的代码,它的工作原理。有任何想法吗?LINQ - 返回随机值不起作用

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="" /> 
+0

你确定你在'_db.Images'中有多个图像? – Aren

+0

http://blogs.msdn.com/b/oldnewthing/archive/2012/05/23/10309199.aspx – Lee

+0

为什么有人会认为Guid是随机的?它不是随机的,而是唯一的。这些是完全不同的东西。 –

回答

0

嗯,我会说,有一次你有linq2entities,有一次linq2object

不知道的是,排序依据(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? 
    } 
} 

应该改变。

+0

这会有同样的问题。 – Servy

+0

嗯,我会试一试。不要说这是完美的随机性,但@Qmal似乎在其网站的另一部分中有“工作”代码。 –

+0

@Servy这为我工作。 – sed

2

Guids are not random numbers。它们通常是连续的,因为它们具有时间戳记组件,这意味着您将始终从该代码获取第一张或最后一张图像。您应该使用Random类(或其中一个密码随机数生成器,如果它非常重要)获取0和您拥有的图像数之间的随机数,然后取第n个图像(其中n是随机数) 。如果你在短时间内多次调用这个函数,那么你应该确保在方法的所有调用之间使用相同的Random实例。 (这意味着使一个私人静态随机比如,你重复使用。)

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