Linq Возвращение случайных объектов после объединения

1

Я пытаюсь вернуть случайные объекты из я join query, который я написал. Но он не возвращается случайным образом. Сущности всегда бывают такими же, как раньше. В чем проблема? Вот запрос

            var query = (from b in db.BrandTbls.AsQueryable()
                     join m in db.ShoeModelTbls on b.BrandID equals m.BrandID
                     join s in db.ShoeTbls on m.ModelID equals s.ModelID
                     join i in db.ShoeImageTbls on s.ShoeID equals i.ShoeID
                     group new {b,m,s,i} by new {b.BrandName,m.ModelName,m.Price,s.PrimaryColor,s.SecondaryColor,i.ImagePath} into g
                     orderby Guid.NewGuid()
                     select new {g.Key.BrandName,g.Key.ModelName,g.Key.ImagePath,g.Key.Price,g.Key.PrimaryColor,g.Key.SecondaryColor}).OrderBy(x => Guid.NewGuid()).Take(8);
Теги:
linq
entity-framework
random

2 ответа

1
Лучший ответ

orderby Guid.NewGuid() будет похож на orderby 1. Это не приведет к случайным возвращениям.

Я бы предложил, чтобы SQL выполнял операцию рандомизации. Посмотрите на это, например:

Случайная строка от Linq до Sql

Вы можете создать пустой метод Random, который LINQ переведет на случайный вызов T_SQL на SQL.

2

GUID не являются случайными числами. Это уникальные номера. Существует несколько способов генерации уникальных значений, многие из которых не являются случайными. Даже для генерируемых значений GUID даже возможно увеличение монотонности, что означало бы, что сортировка по новым указателям для каждого элемента в последовательности приведет к тому, что каждый элемент останется в точно таком же порядке.

Перетасовка набора данных - это хорошо определенная проблема с хорошо определенными решениями. Вы должны использовать одно из хорошо документированных решений проблемы перетасовки, чтобы надежно и эффективно перетасовывать коллекцию данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню