Lấy các dòng ngẫu nhiên (LINQ tip #3)
Trong SQL Server, để lấy về một tập kết quả ngẫu nhiên, bạn có thể viết:
SELECT TOP 5 * FROM myTable ORDER BY NEWID()
Trong LINQ, nếu muốn lấy về một tập kết quả ngẫu nhiên kiểu như trên, bạn cần tạo một hàm ngẫu nhiên, sau đó thêm nó vào LINQ designer, và dùng hàm đã tạo để sắp xếp. Các bước cụ thể như sau:
Tạo một SQL Server Project:
Thêm vào một user-defined function có tên RandomInt, đây là một hàm CLR chạy trong CSDL:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
private readonly static Random r = new Random();
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlInt32 RandomInt()
{
return r.Next();
}
};
Sau đó, bạn bấm nút phải vào SQL Server Project vừa tạo và chọn Deploy:
và kéo hàm này từ cửa sổ Server Explorer vào LINQ Designer:
Sau khi kéo thả, bạn sẽ thấy hàm này xuất hiện tren MethodPane của cửa sổ LINQ Designer:
Và có thể dùng nó trong câu lệnh lấy dữ liệu ngẫu nhiên như sau:
DataClasses1DataContext _context = new DataClasses1DataContext();
var s = (from c in _context.mytable orderby _context.RandomInt() select c).Take(5);
Khi đó, s sẽ chứa 5 dòng ngẫu nhiên từ CSDL (theo thứ tự ngẫu nhiên).




Trường hợp xài SQL 2k (không hỗ trợ tạo SQL Server Project) thì sao ạh?
Trời, vậy là làm khó nhau rồi
. Chắc vào thời điểm này, không có dự án mới nào sử dụng LINQ (của năm 2008) trên SQL 2000 (của năm 2000) đâu nhỉ?
Theo tôi đoán (chưa kiểm tra) nếu dùng LINQ trên SQL 2000 bạn cũng không thể dùng Skip() được vì hàm này sử dụng hàm ROW_NUMBER, vốn chỉ có từ SQL Server 2005.
Hết rồi hả thầy
Hết gì cơ ???
[quote]Sau đó, bạn Deploy và kéo hàm này từ cửa sổ Server Explorer vào LINQ Designer:[/quote]
Dòng này nghĩa là sao vậy thầy?
Vừa cập nhật kỹ hơn, em xem lại nhé.
Nếu ai có kinh nghiệm để làm điều này với LINQ trên các phiên bản cũ hơn SQL 2005 thì xin hãy chia sẻ luôn nhé. Thanks.
Nó bảo em enable CLR mà em truy vấn:
EXEC sp_CONFIGURE ‘clr enabled’ , ‘1′
GO
RECONFIGURE WITH OVERRIDE;
GO
Nó debug hoài không xong. Không hiểu tại sao.
Thầy enable CLR làm sao vậy ạh?
Àh OK được rồi ạh.
Execute nó lâu wá em tưởng nó treo
Chào anh Nam, nhờ anh giúp em chuyển câu truy vấn này sang LINQ nha! em cảm ơn anh rất nhiều:
SELECT *
FROM tbSanPham sp, tbHinhanh ha
WHERE sp.ma_sp == ha.ma_sp
AND sp.ma_sp=’SP001′
Em đang làm LinQ mà không biết truy vấn như thế nào, mong anh giúp em.
@[potay]-com:
Giả sử: đặt tên biến DataContext là ctx, em có thể dùng câu lệnh join để kết hợp từ 2 bảng, rồi trả về tập kết quả như sau:
class SP
{
public SP(tbSanpham sp, tbHinhanh ha)
{
this.sp = sp;
this.ha = ha;
}
...
}
...
var sps = from sp in ctx.tbSanpham inner join ha in ctx.tbHinhanh on sp.masp equals ha.masp where sp.masp = "SP001" select new SP(sp, ha);
Khi đó nếu muốn truy cập vào từng kết quả, em có thể viết:
SP sp = sps.Single();
print(sp.Sp.Tensanpham);