2017-01-12 3 views
1

Я пытаюсь извлечь записи из таблицы БД, которая имеет разные категории. Я хочу получить 1 случайную запись с каждого уровня.Linq Union и Take

Я пытался добиться этого с помощью:

var results = (from o in db.tblName 
       where o.category== 1 
       orderby Guid.NewGuid() 
       select o).Take(1).Union 
       (from o in db.tblName 
        where o.category == 2 
        orderby Guid.NewGuid() 
        select o).Take(1).Union 
       (from o in db.tblName 
        where o.category == 3 
        orderby Guid.NewGuid() 
        select o).Take(1).Union 
       (from o in db.tblName 
        where o.category == 4 
        orderby Guid.NewGuid() 
        select o).Take(1); 

Используя приведенный выше код привел к 1 запись получения файла вместо 4

Что я делаю не так?

+0

последнее, что вы делаете, это взять (1) – user1336827

ответ

0

Это происходит потому, что каждый Take применяется к результату всех предшествующих Union х в цепи, т.е.

a.Take(1).Union(b).Take(1) 

Вам нужно добавить скобки к вашим Take с, чтобы убедиться, что это

a.Take(1).Union(b.Take(1)) 

Ваш запрос должен выглядеть следующим образом:

var results = 
     ((from o in db.tblName where o.category== 1 orderby Guid.NewGuid() select o).Take(1)) 
.Union((from o in db.tblName where o.category == 2 orderby Guid.NewGuid() select o).Take(1)) 
.Union((from o in db.tblName where o.category == 3 orderby Guid.NewGuid() select o).Take(1)) 
.Union((from o in db.tblName where o.category == 4 orderby Guid.NewGuid() select o).Take(1)); 

Вы можете еще больше упростить запрос следующим образом:

var categories = new[] {1, 2, 3, 4}; 
var result = categories.Select(
    c => (from o in db.tblName where o.category==c orderby Guid.NewGuid() select o).Take(1) 
).Distinct(); 
+0

Вы правы, пропустили это как-то. Благодаря! –

0

вы не можете сделать что-то вроде этого, если я понимаю ваше требование правильно.

Random rnd = new Random(); 


    var results = db.tblName.GroupBy(q => q.category) 
       .Select(g => g.ElementAt(rnd.Next(0, g.Count()))).ToList();