Một số lưu ý khi sử dụng Linq trong C#

Tram Ho

Hi anh em, chúc mọi người một ngày làm việc hiệu quả và đây năng lượng. Hôm nay mình sẽ nói về một số kinh nghiệm của mình khi làm việc với LINQ C#.

Không để anh em chờ lâu, cùng bắt đầu vào bài viết nào. Bài viết này mình sẽ nói các tool để theo dõi performance khi sử dụng linq và một số lưu ý về việc viết linq trong C#.

1. Source code Linq của Microsoft

Ví dụ: ta có thể xem method Count() viết như thế nào
image.png

2. Một số tool để monitor performance khi sử dụng linq

  • SQL Server Profiler: Cho phép ghi lại và phân tích câu truy vấn được tạo ra từ Linq
    image.png
  • LINQPad: https://www.linqpad.net/ một công cụ giúp viết và test linq query, phân tích performance và thời gian execute của query.
  • Stopwatch class: Đo thời gian chạy trước và sau khi query thực thi.
  • BenchMark Dotnet: cho phép so sánh thời gian chạy giữa nhiều function. https://github.com/dotnet/BenchmarkDotNet

3. Sử dụng IQueryable thay cho IEnumerable

  • Iqueryable cho phép build query và execute query dựa trên database thay vì thực thi trên memory nếu sử dụng IEnumerable. Điều này giúp cải thiện performance khi query với data lớn.

Ví dụ:

  • Ta có list chứa 1000000 customer và ta so sánh peformance khi sử dụng IQueryable và IEnumerable

**=> Kết quả: **

4. Sử dụng method syntax thay vì query syntax

  • Sử dụng method syntax nhanh hơn query syntax bởi vì query syntax sẽ được C# compiler chuyển đổi thành method syntax trước khi nó thực thi.
  • Tuy nhiên performance giữa method syntax và query syntax không đáng kể, nhưng best practice khi làm việc với linq là sử dung method syntax đặc biệt với lượng data lớn.

Ví dụ:

  • Ta có list 1000000 orders

=> Kết quả:

5. Cẩn thận khi sử dụng GroupBy

  • Group by tốn rất nhiều chi phí nên nếu ta lạm dụng có thể làm cho performance không tốt.

Ví dụ:

  • Ta có một list orders của các customers và mỗi customer có thể có ít nhất 1 order. Yêu cầu: lấy ra tổng số lượng order của mỗi customer.
  • Ta sẽ viết theo 2 cách và dùng benchMark để so sánh performance:

=> Kết quả:

image.png

6. Sử dụng AsNoTracking trong Linq Entity framework

  • Sử dụng AsNoTracking, Entity framework sẽ không track lại những thay đổi của entites. Điều này giúp cải thiện performance và giảm sử dụng bộ nhớ khi get dữ liệu bởi vì get dữ liệu không cần phải track lại những thay đổi.
    Ví dụ:

=> Kết quả:

7. Sử dụng Parallel LINQ

  • Sử dụng Parallel LINQ có thể cải thiện performance của linq. Sau đây là 1 ví dụ:

=>Kết quả:

8. Linq performance trong .NET 7

  • Ở phần này mình sẽ dùng benchmark so sánh performance giữa .net 6 và .net 7. Ở đây mình tham khảo page:
    https://code-maze.com/linq-performance-dotnet7/
  • Kết quả của 1 số methods:
    • Min(), Max(), Average(), Count(), và Sum()
      image.png
    • First() và Last()
      image.png
    • Filtering Methods – Distinct() và Where()
      image.png

9. Tổng kết

  • Qua bài viết này hy vọng mọi người hiểu thêm về LINQ và giúp ích được anh em với một số tips.
  • Cảm ơn mọi người đã xem bài viết. Chúc anh em một ngày làm việc hiệu quả và đầy năng lượng.
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo