我有以下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来完成它
答案 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
有效。