Debugging Entity Framework Core

#588 – December 21, 2025

8 real-world query anti‑patterns

Hello, đź‘‹

This is the last issue in 2025. We'll take a short break over Christmas to recharge and will be back on the first Monday in January. Thank you so much for your support and your lovely feedback. I have a lot to go through from the survey and figure out what to bring into the newsletter.

Lastly, I'd like to ask you to share the newsletter with your tech friends and colleagues. It helps heaps.

Debugging Entity Framework Core: 8 real-world query anti‑patterns
7 minutes by Chris Woodruff

Chris explores eight common Entity Framework Core query problems that slow down database performance. He demonstrates each issue using a demo with intentionally poor database design. Each problem shows the slow LINQ query, explains why it performs badly, and provides both quick database fixes and proper long-term solutions.

Bring Order to Engineering Chaos
sponsored by Zencoder

C# teams deal with sprawling services, legacy patterns, and endless cross-repo surprises. Zenflow brings structure back: clear specifications, AI-generated implementation plans, and automated verification that ensures changes land cleanly across your .NET codebase. If you’re done firefighting regressions and chasing context across Slack threads, Zenflow is the application your team has been missing.

Your cache is not protected from cache stampede
5 minutes by Alexey Fedorov

Cache stampede happens when multiple threads execute the same expensive operation simultaneously after a cache expires. ConcurrentDictionary and MemoryCache don't protect against this problem, leading to duplicate database calls or API requests. HybridCache in .NET 9 solves this issue within a single process but not across multiple replicas. For multi-replica applications, consider cache TTL jittering or Single Flight patterns.

The .NET pipeline that makes source generators feel instant
10 minutes by Roxeem

Source generators create new code files during compilation. They work through incremental pipelines that break work into stages and cache results to stay fast. The pipeline uses immutable data and pure functions. When you edit code, only the affected parts recompute. This keeps IntelliSense responsive even with complex generators. You build pipelines by chaining transformations like filtering syntax nodes, creating models, and emitting code.

Creating a .NET CLR profiler using C# and NativeAOT with Silhouette
15 minutes by Andrew Lock

Andrew uses Kevin Gosse's Silhouette library for building .NET CLR profilers. He creates a basic profiler that logs assembly loading events. Silhouette solves the traditional problem of needing C++ code by using NativeAOT to compile C# into native binaries. The library handles the complex setup work, letting developers write profiler logic in familiar C# instead of wrestling with native APIs.

Entity Framework Core bulk data retrieval: 5 methods you should know
10 minutes by Anton Martyniuk

Entity Framework Core's Contains method struggles with large datasets because it hits SQL Server's 2,100 parameter limit and creates performance issues. The Entity Framework Extensions library solves this by offering five bulk retrieval methods that use temporary tables internally. Anton explores these methods which include WhereBulkContains for filtering entities, BulkRead for immediate results, and filter list methods for separating existing from new data.

And the most popular article from the last issue was:

Happy holidays!
Jakub

newsletters