Я пытаюсь вернуть случайные объекты из я 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);
orderby Guid.NewGuid()
будет похож на orderby 1. Это не приведет к случайным возвращениям.
Я бы предложил, чтобы SQL выполнял операцию рандомизации. Посмотрите на это, например:
Случайная строка от Linq до Sql
Вы можете создать пустой метод Random, который LINQ переведет на случайный вызов T_SQL на SQL.
GUID не являются случайными числами. Это уникальные номера. Существует несколько способов генерации уникальных значений, многие из которых не являются случайными. Даже для генерируемых значений GUID даже возможно увеличение монотонности, что означало бы, что сортировка по новым указателям для каждого элемента в последовательности приведет к тому, что каждый элемент останется в точно таком же порядке.
Перетасовка набора данных - это хорошо определенная проблема с хорошо определенными решениями. Вы должны использовать одно из хорошо документированных решений проблемы перетасовки, чтобы надежно и эффективно перетасовывать коллекцию данных.
orderby Guid.NewGuid()
делает работу с EF4 +. См. Stackoverflow.com/a/4651405/158074