thảo luận Trong .Net có cách nào query giống select top trong sql server không?

  • Người tạo chủ đề Người tạo chủ đề huyit1999a
  • Ngày bắt đầu Ngày bắt đầu

huyit1999a

Senior Member
Hi các bác,
Em gặp 1 case do data trong database nhiều. Em select top 100 trong sql server thì ra. Còn trong code viết thế nào để chạy ra được câu select top nhĩ. Em có xem thấy take và skip thì là offset và limit. Nhờ các bác giúp với
 
LIMIT chính là TOP đó bạn. Sql server không có cú pháp limit, mà nó dùng top để lấy ngẫu nhiên n bản ghi. Các db khác dùng cú pháp limit với tác dụng tương tự.
 
Hi các bác,
Em gặp 1 case do data trong database nhiều. Em select top 100 trong sql server thì ra. Còn trong code viết thế nào để chạy ra được câu select top nhĩ. Em có xem thấy take và skip thì là offset và limit. Nhờ các bác giúp với
Mình tưởng trong .net vẫn dùng sql được mà. Tùy vào thư viện hoặc kết nối chứ.
Mình không chuyên về .net lắm. Nhưng có hệ thống đang dùng thấy với Oracle, thì có hàm truyền sql về ra list luôn.
SQL thì FETCH NEXT N ROWS ONLY hoặc rownum.
 
Mình tưởng trong .net vẫn dùng sql được mà. Tùy vào thư viện hoặc kết nối chứ.
Mình không chuyên về .net lắm. Nhưng có hệ thống đang dùng thấy với Oracle, thì có hàm truyền sql về ra list luôn.
SQL thì FETCH NEXT N ROWS ONLY hoặc rownum.
Ý mình là viết câu query trong .NET sao cho convert giống SELECT TOP trong SQL Server á.
Ví dụ: db.Products.Where(p => p.Name == "product").Take(10).ToList();
Như @manebane nhắn ở trên vậy take tức là select top rồi. Nhưng khi mình chạy code thì bị timeout.
 
Ý mình là viết câu query trong .NET sao cho convert giống SELECT TOP trong SQL Server á.
Ví dụ: db.Products.Where(p => p.Name == "product").Take(10).ToList();
Như @manebane nhắn ở trên vậy take tức là select top rồi. Nhưng khi mình chạy code thì bị timeout.
à sao ko code cái helper truyền sql vô cho linh động. Làm như trên nhiều hạn chế lắm.
 
cái này dùng LINQ phát 1 mà nhỉ
thím xem thử câu này trên stackoverflow xem
LINQ to take top records
xjIzSG9.png
 
Ý mình là viết câu query trong .NET sao cho convert giống SELECT TOP trong SQL Server á.
Ví dụ: db.Products.Where(p => p.Name == "product").Take(10).ToList();
Như @manebane nhắn ở trên vậy take tức là select top rồi. Nhưng khi mình chạy code thì bị timeout.
mình thấy câu này ok mà. Bị timeout thì bác check connect đến db server của bạn đc không, hoặc data quá lớn, bác đánh index xem
 
thanks các bác data khoảng 6m records giờ em đang query để xoá bớt các data xoá mềm. Mà cột status thì k có index nên query bị lâu.
Em đã dùng asNoTracking để select lại recordId xon query thêm lần nữa. Hơi chuối 😂. Tại này em viết tool console để clear data thôi
 
Bạn nên viết script để xóa dữ liệu sẽ ổn hơn và mỗi lần chỉ xóa 1 lượng bản ghi nhất định(100 bản ghi), nếu là data quan trọng nên lưu dữ liệu xóa vào bảng deleted để có thể xem lại khi cần thiết.
 
thanks các bác data khoảng 6m records giờ em đang query để xoá bớt các data xoá mềm. Mà cột status thì k có index nên query bị lâu.
Em đã dùng asNoTracking để select lại recordId xon query thêm lần nữa. Hơi chuối 😂. Tại này em viết tool console để clear data thôi
Nếu thím dùng EF core 7 trở lên thì có thể thử cái này ExecuteUpdate and ExecuteDelete - EF Core (https://learn.microsoft.com/en-us/ef/core/saving/execute-insert-update-delete). Mình có thể xóa trực tiếp luôn mà không phải tốn thêm 1 bước để query data.
 
Nói thật bác đừng chửi tôi. Task này bác nên để ai đó có kinh nghiệm nhiều hơn làm đi. Chứ bác làm dễ toang lắm data nhà người ta lắm.
  • Bác ko biết paging với entity framework (hoặc SQL)
  • Bác ko phân biệt đc select top vs offset/limit
  • Bác ko biết chạy câu sql (or store procedure) từ enty framework (hoặc ADO.NET)
  • Bác ko biết entity framework profiling (để xem câu SQL generate bởi entity framework). Cái lỗi timeout thì ăn ốc đoán mò nhưng cũng phải đúng tầm 90% là gọi ToList trước đó rồi (dẫn đến query nguyên cái table).
  • Và chắc chắn bác ko biết cách viết code để entity framework gen SQL theo ý mình (cái này làm đc nhưng nó cũng có nhiều hạn chế và bình thường chẳng ai làm vậy)
  • Cái này ko chắc chắn lắm nhưng có vẻ bác cũng ko có plan B cho trường hợp xóa nhầm data hoặc cần restore lại data đã xóa. Hoặc trong trường hợp table này đang được sử dụng nhiều bởi ứng dụng khác.
 
Ý mình là viết câu query trong .NET sao cho convert giống SELECT TOP trong SQL Server á.
Ví dụ: db.Products.Where(p => p.Name == "product").Take(10).ToList();
Như @manebane nhắn ở trên vậy take tức là select top rồi. Nhưng khi mình chạy code thì bị timeout.
tại sao không viết sql dạng câu query mà viết sql dạng như trên trong .net cho viết sql dạng query mà
 
Hi các bác,
Em gặp 1 case do data trong database nhiều. Em select top 100 trong sql server thì ra. Còn trong code viết thế nào để chạy ra được câu select top nhĩ. Em có xem thấy take và skip thì là offset và limit. Nhờ các bác giúp với
làm cách như trên gọi là linq to object,linq to object là do .NET framework xử lý, có nghĩa là nó sẽ lấy toàn bộ data trong table đổ lên ram trước sau đó sẽ lọc, nên trong trường hợp data nhiều thì tốc độ xử lý sẽ chậm, chỉ thích hợp cho những truy vấn đơn giản data vừa phải thôi,suy ra dùng cách đó không phải tối ưu trong mọi tình huống,
 
Nói thật bác đừng chửi tôi. Task này bác nên để ai đó có kinh nghiệm nhiều hơn làm đi. Chứ bác làm dễ toang lắm data nhà người ta lắm.
  • Bác ko biết paging với entity framework (hoặc SQL)
  • Bác ko phân biệt đc select top vs offset/limit
  • Bác ko biết chạy câu sql (or store procedure) từ enty framework (hoặc ADO.NET)
  • Bác ko biết entity framework profiling (để xem câu SQL generate bởi entity framework). Cái lỗi timeout thì ăn ốc đoán mò nhưng cũng phải đúng tầm 90% là gọi ToList trước đó rồi (dẫn đến query nguyên cái table).
  • Và chắc chắn bác ko biết cách viết code để entity framework gen SQL theo ý mình (cái này làm đc nhưng nó cũng có nhiều hạn chế và bình thường chẳng ai làm vậy)
  • Cái này ko chắc chắn lắm nhưng có vẻ bác cũng ko có plan B cho trường hợp xóa nhầm data hoặc cần restore lại data đã xóa. Hoặc trong trường hợp table này đang được sử dụng nhiều bởi ứng dụng khác.
bác phán chuẩn đấy. tui đã báo giao task lại cho anh lead rồi
 
làm cách như trên gọi là linq to object,linq to object là do .NET framework xử lý, có nghĩa là nó sẽ lấy toàn bộ data trong table đổ lên ram trước sau đó sẽ lọc, nên trong trường hợp data nhiều thì tốc độ xử lý sẽ chậm, chỉ thích hợp cho những truy vấn đơn giản data vừa phải thôi,suy ra dùng cách đó không phải tối ưu trong mọi tình huống,
vậy tình huống này thì dùng cách nào vậy bác. Cái này em viết console app để test thôi. bác cho em keywork được không
 
vậy tình huống này thì dùng cách nào vậy bác. Cái này em viết console app để test thôi. bác cho em keywork được không
Câu query của bạn đúng rồi không có sai đâu, nó timeout chắc do lỗi khác, bạn nên show full code để mọi người tư vấn dễ hơn. Với lại có task thì cứ làm đi, làm sai thì có leader review có gì đâu mà sợ.
 

Thống kê chủ đề

Ngày tạo
huyit1999a,
Người trả lời cuối
Web.Coder,
Trả lời
15
Lượt xem
1.331
Quay lại
Lên đầu trang