Linq to sql linqtosql select random行中缺少按顺序排序

Linq to sql linqtosql select random行中缺少按顺序排序,linq-to-sql,Linq To Sql,我有以下linq查询: IQueryable<Message> messagesQuery = (from message in _context.Db.Messages where message.MessageListId == item.MessageListId &&

我有以下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();
IQueryable messagesQuery=(来自_context.Db.Messages中的消息
其中message.MessageListId==item.MessageListId
&&
!\u context.Db.ScheduleXMessages.Any(x=>x.MessageId==message.MessageId&&x.ScheduleId==item.ScheduleId)
选择消息);
如果(随机发送消息)
返回(从messagesQuery orderby Guid.NewGuid()中的mq选择mq).FirstOrDefault();
返回(从messagesQuery orderby mq.OrderIndex选择mq中的mq)。FirstOrDefault();
现在,如果randomSendMessage为true,则不会将order by添加到select。如果为false,则会将Order By OrderIndex添加到select

对可能发生的事情有什么想法吗

谢谢


编辑不,如果我提前选择列,则不起作用。它只是将guid作为参数发送,而不是使用orderby newid(),而是使用一个guid来发送。不确定发生了什么,但我猜它不支持这种类型的排序。。。可能是因为它没有在选择列表中定义。尝试另一种选择:

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(); 
IQueryable messagesQuery=(来自_context.Db.Messages中的消息
其中message.MessageListId==item.MessageListId
&& 
!\u context.Db.ScheduleXMessages.Any(x=>x.MessageId==message.MessageId&&x.ScheduleId==item.ScheduleId)
选择新建{Message=Message,ID=Guid.NewGuid()});
如果(随机发送消息)
返回(从messagesQuery orderby mq.ID中的mq选择mq.Message);
返回(从messagesQuery orderby mq.Message.OrderIndex中的mq选择mq.Message)。FirstOrDefault();

查看是否通过将ID存储在记录中解决了此问题。

我想应该很明显L2S不知道如何处理Guid.NewGuid():)

我在这里找到了答案:


它可以工作。

如果您想使用LINQ to SQL获得随机结果,可以使用Marc Gravell的。我最近解释了如何设置一个分部类来使用它。否则,您可能必须设置存储过程或UDF

编辑:我看了你提到的博客文章。作者实际上指出马克的解决方案是另一种选择:)

nice:)-我实际上没有读到博客的最后一行。谢谢