2010-03-03 35 views
5

tôi biết sử dụng các tính năngchọn hàng n ngẫu nhiên qua linq2sql

ORDER BY NEWID() 

khi chạy một lệnh thường xuyên sql. Tôi muốn làm điều tương tự, nhưng thông qua linq2sql.

Tôi muốn không để chọn toàn bộ phạm vi, thêm vào một số ngẫu nhiên qua rnd.Next(), và sau đó sắp xếp bởi điều đó ...

Trả lời

3

Marc Gravell đăng một solution here cho phép bạn xác định hàm sử dụng NEWID trong lớp học một phần cho DataContext. Không đặt nó trong lớp DataContext được tạo ra nếu không các bản cập nhật trong tương lai sẽ xóa sạch những gì bạn đã thêm vào.

Marc hiển thị cách sử dụng nó với cú pháp biểu thức truy vấn. Cách khác, với ký hiệu chấm, bạn có thể viết:

var results = dc.Table.OrderBy(r => dc.Random()).Take(n); 

Trong trường hợp bạn không quen với việc tạo lớp học, chỉ cần thêm lớp mới vào giải pháp của bạn. Tên của nó không quan trọng miễn là định nghĩa lớp sử dụng tên lớp DataContext với từ khóa partial. Ví dụ, nếu DataContext của bạn được đặt tên XYZDataContext bạn có thể thêm một lớp mới có tên XYZDataContextPartial.cs và xác định nó như là:

namespace YourNamespace 
{ 
    public partial class XYZDataContext 
    { 
    } 
} 
+0

hoàn hảo! Giải pháp của Marc hoạt động chính xác như tôi đã hy vọng. – benpage

2

Hãy thử phương pháp Take phần mở rộng:

.OrderBy(x=>x.NewId) 
.Take(randomNumber); 

Những gì chúng ta đang làm ở đây là:

  1. Sắp xếp theo lĩnh vực newid để ASC.
  2. Chọn hàng đầu tiên N, trong đó N là số ngẫu nhiên.

Trong trường hợp đó bạn muốn trật tự là ngẫu nhiên, hãy thử này:

.OrderBy(x => Guid.NewGuid()) 
.Take(20); 

Những gì chúng ta đang làm ở đây là:

  1. thứ tự danh sách theo một thứ tự ngẫu nhiên .
  2. Lấy 20 hàng hàng đầu.
Các vấn đề liên quan