代码之家  ›  专栏  ›  技术社区  ›  sirrocco

linqtosql select random行中缺少的顺序

  •  0
  • sirrocco  · 技术社区  · 14 年前

    我有以下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中。如果为false,则order by orderindex将添加到select中。

    有什么想法吗?

    谢谢。

    编辑 不,如果我选择前面的列就不行了。它只是将guid作为参数发送,而不是使用orderby newid(),而是使用一个guid

    3 回复  |  直到 14 年前
        1
  •  1
  •   Community Egal    7 年前

    如果您想用linq to sql得到随机结果,可以使用marc gravell的 solution here . 我最近解释了如何设置一个部分类来使用它 in this post . 否则,可能需要设置存储过程或UDF。

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

        2
  •  0
  •   Brian Mains    14 年前

    不太清楚到底发生了什么,但我猜它不支持那种排序…可能是因为它没有在选择列表中定义。尝试另一种选择:

    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存储在记录中解决了这个问题。

        3
  •  0
  •   sirrocco    14 年前

    我想很明显L2不知道该怎么处理guid.newguid():)。

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

    它起作用了。