顺序在linqtosql中缺少选择随机行

时间:2010-03-03 18:32:57

标签: linq-to-sql

我有以下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,则order by不会添加到select中。如果它为假,则将Order By OrderIndex添加到选择中。

关于可能发生的事情的任何想法?

感谢。

编辑不,如果我事先选择了该列,则无效。它只是将guid作为参数发送,而不是通过newid()执行命令,它通过使用一个单一的guid来完成它

3 个答案:

答案 0 :(得分:1)

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

编辑:我看了你提到的博客文章。作者实际上指出了Marc的解决方案:)

答案 1 :(得分:0)

不完全确定发生了什么,但我的猜测是它不支持这种类型的排序......可能是因为它没有在选择列表中定义。尝试替代方案:

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(); 

查看是否通过将ID存储在记录中来解决它。

答案 2 :(得分:0)

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

我在这里找到了答案:http://weblogs.asp.net/fmarguerie/archive/2008/01/10/randomizing-linq-to-sql-queries.aspx

有效。