2012-05-24 93 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