Linq to Entities,隨機順序

c# entity-framework linq-to-entities

如何以隨機順序返回匹配的實體?
要明確這是Entity Framework的東西和LINQ to Entities。

(航空代碼)

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby ?????
                                select en;

謝謝

編輯:
我嘗試將其添加到上下文中:

public Guid Random()
{
    return new Guid();
}

並使用此查詢:

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby context.Random()
                                select en;

但我得到了這個錯誤:

System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Guid Random()' method, and this method cannot be translated into a store expression..

編輯(當前代碼):

IEnumerable<MyEntity> results = (from en in context.MyEntity
                                 where en.type == myTypeVar
                                 orderby context.Random()
                                 select en).AsEnumerable();

一般承認的答案

簡單的解決方案是創建一個數組(或List<T> ),然後將其索引隨機化。

編輯:

static IEnumerable<T> Randomize<T>(this IEnumerable<T> source) {
  var array = source.ToArray();
  // randomize indexes (several approaches are possible)
  return array;
}

編輯:就個人而言,我發現Jon Skeet的答案更優雅:

var results = from ... in ... where ... orderby Guid.NewGuid() select ...

當然,您可以使用隨機數生成器而不是Guid.NewGuid()


熱門答案

這樣做的一個簡單方法是通過Guid.NewGuid()進行排序,然後在客戶端進行排序。你可能能夠說服EF在服務器端做一些隨機的事情,但這並不一定簡單 - 使用“隨機數排序”這樣做顯然已被打破

要在.NET端而不是在EF中進行排序,您需要AsEnumerable

IEnumerable<MyEntity> results = context.MyEntity
                                       .Where(en => en.type == myTypeVar)
                                       .AsEnumerable()
                                       .OrderBy(en => context.Random());

最好將無序版本放入列表然後隨機播放。

Random rnd = ...; // Assume a suitable Random instance
List<MyEntity> results = context.MyEntity
                                .Where(en => en.type == myTypeVar)
                                .ToList();

results.Shuffle(rnd); // Assuming an extension method on List<T>

除了其他任何東西之外,洗牌比排序更有效。有關獲取適當的Random實例的詳細信息,請參閱我的隨機性文章 。 Stack Overflow上有很多Fisher-Yates shuffle實現。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因