Порядок Отсутствует в linqtosql выберите случайную строку - PullRequest
0 голосов
/ 03 марта 2010

У меня следующий запрос linq:

IQueryable<Message> messagesQuery = (from message in _context.Db.Messages
                                where message.MessageListId == item.MessageListId
                                         &&
                                         !_context.Db.ScheduleXMessages.Any(x => x.MessageId == message.MessageId && x.ScheduleId == item.ScheduleId)
                                select message);
        if (randomSendMessage) 
            return (from mq in messagesQuery orderby Guid.NewGuid() select mq).FirstOrDefault();
        return (from mq in messagesQuery orderby mq.OrderIndex select mq).FirstOrDefault();

Теперь, если randomSendMessage имеет значение true, порядок по не добавляется в выбор. если значение равно false, то в список выбора добавляется Order By OrderIndex.

Есть идеи о том, что может происходить?

Спасибо.

Редактировать Нет, это не сработает, если я выберу столбец заранее. Он просто отправляет guid в качестве параметра и вместо того, чтобы выполнять orderby newid (), он делает это, используя один единственный guid

Ответы [ 3 ]

1 голос
/ 04 марта 2010

Если вы хотите получить случайные результаты с LINQ to SQL, вы можете использовать решение Марка Гравелла здесь . Недавно я объяснил, как настроить частичный класс для его использования в этом посте . В противном случае вам может потребоваться настроить хранимую процедуру или UDF.

РЕДАКТИРОВАТЬ: Я посмотрел на блоге, который вы упомянули. Автор фактически указал на решение Марка в качестве альтернативы:)

0 голосов
/ 04 марта 2010

Полагаю, чертовски очевидно, что L2S не будет знать, что делать с Guid.NewGuid ():).

Я нашел ответ здесь: http://weblogs.asp.net/fmarguerie/archive/2008/01/10/randomizing-linq-to-sql-queries.aspx

Работает.

0 голосов
/ 03 марта 2010

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

IQueryable<Message> messagesQuery = (from message in _context.Db.Messages 
                                where message.MessageListId == item.MessageListId 
                                         && 
                                         !_context.Db.ScheduleXMessages.Any(x => x.MessageId == message.MessageId && x.ScheduleId == item.ScheduleId) 
                                select new { Message = message, ID = Guid.NewGuid() }); 
        if (randomSendMessage)  
            return (from mq in messagesQuery orderby mq.ID select mq.Message).FirstOrDefault(); 
        return (from mq in messagesQuery orderby mq.Message.OrderIndex select mq.Message).FirstOrDefault(); 

чтобы узнать, разрешило ли это это, сохранив идентификатор в записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...