2010-03-03 23 views
0

我有以下LINQ查詢:順序按在linqtosql缺少選擇隨機行

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是真實的,由訂單不會被添加到該選擇。如果它是錯誤的,那麼Order By OrderIndex被添加到選擇。

關於可能會發生什麼的任何想法?

謝謝。

編輯不行,如果我選擇列的前面,它不起作用。它只是發送guid作爲參數,而不是通過newid()執行一個命令,它通過使用一個單一的guid來完成它

回答

1

如果你想獲得隨機結果與LINQ to SQL,你可以使用Marc Gravell的solution here。我最近解釋瞭如何設置部分類來使用它in this post。否則,您可能需要設置存儲過程或UDF。

編輯:我看了一下你提到的博客文章。作者實際上指出了Marc的解決方案作爲替代:)

+0

很好:) - 我沒有真正閱讀博客中的最​​後一行。謝謝。 – sirrocco 2010-03-07 05:02:43

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來解決問題。