Skip to main content

Posts

EF Core 10–Smarter parameterized collections

If you've been using Entity Framework Core for a while, you've probably written a query like this: var ids = new[] { 1, 2, 3, 4, 5 }; var blogs = await context.Blogs .Where(b => ids.Contains(b.Id)) .ToListAsync(); Simple enough. But under the hood, how EF Core translates that ids collection into SQL has quietly changed(again) in EF Core 10, and this time the change is significant enough to be listed as a breaking change. Let's dig into what's happening, why the EF team made this call, and what it means for your applications. A brief history To understand EF Core 10's approach, it helps to know where things stood before. EF Core 8: The OPENJSON era In EF Core 8, when you passed a collection to a LINQ Contains or Where clause, EF encoded the entire collection as a JSON string and sent it as a single parameter. SQL Server would then unpack it using the OPENJSON function: SELECT [b].[Id], [b].[Name] FROM [Blogs] AS [b] WHERE [b].[Id] IN ( ...
Recent posts

Respect what came before

A colleague told me a story recently. A new architect joined his project. Experienced, credentialed, confident. And from day one, all he did was explain what was wrong with the existing system. The choices that were made, the patterns that were used, the technical debt that had accumulated. An endless inventory of flaws. I've seen this before. And it always makes me uneasy. Not because criticism is bad. Codebases do accumulate real problems. Patterns do become outdated. But there's a specific kind of criticism — reflexive, premature, delivered without curiosity — that reveals something troubling about the person offering it. The most dangerous person in a technical team isn't the one who doesn't know enough — it's the one who arrives certain they know better. Every system is a set of scars Software systems carry history inside them. A module that looks over-engineered almost certainly went through a painful incident that demanded it. A seemingly arbitra...

GitHub Copilot AI Credits switch: Here's what to do before June 1

On June 1, 2026 , GitHub Copilot drops its old premium-request model and goes fully token-based. Every interaction (chat, agent mode, code review,...) will now draw down a pool of GitHub AI Credits , where 1 credit = $0.01 USD . Code completions stay free and unlimited, but everything else is metered. The base plan prices aren't changing. Copilot Business stays $19/month and includes $19 in credits. Copilot Enterprise stays $39/month with $39 in credits. But here's the catch: once your included credits are gone, you either pay overage or you stop. No more "unlimited premium requests with a monthly cap." You get a dollar amount, and you spend it. That makes budgeting more important than ever — especially for teams and power users running agentic workflows (aren’t we all?). What you're paying for Before you can budget, you need to understand the cost drivers. GitHub AI Credits are consumed based on token usage: the number of tokens sent to and received from...

Using ExecutionLog views in SQL Server Reporting Services to monitor performance

After upgrading our SQL Server Reporting Services (SSRS) environment, we noticed some isuses: reports were slow, users were complaining, and we had no idea where to start. The good news is that SSRS has been quietly collecting detailed execution data the whole time — and a set of built-in views makes it surprisingly easy to query. This post walks through the ExecutionLog views, what they contain, and how to turn that data into actionable performance insights. What are the ExecutionLog views? SSRS logs every report execution to the ReportServer database. Three views expose this data at different levels of detail: ExecutionLog — A simple view covering the basics: report name, user, start time, and duration. Good for quick lookups. ExecutionLog2 — Adds AdditionalInfo , an XML column with richer metadata such as estimated row counts and data source connection details. ExecutionLog3 — The most complete view. Breaks execution time into three distinct phases — TimeData...

Always know where you stand: Setting up a live status line in GitHub Copilot CLI

Yesterday I introduced to you statusline command. It allows you to configure a persistent, live bar at the bottom of your CLI session that shows whatever your script prints — token usage, context percentage, current model, cost estimates, session duration, and more. I promised that we would setup something like this: █████░░░░░ 50% 64.0k/128.0k | ✱ Sonnet 4.5 | ~$0.04 | ⏱️ 00:12:34 But yesterday we only got as far as showing this: Hello from PowerShell status line! If you missed the previous post, go read it first, before continuing here. Back? Let's continue... Now we have confirmed the script runs and we've the payload, we can now focus on creating a production-ready version. It extracts context usage, model name, cost (from the payload if available, estimated otherwise), and session duration. I first created my own version but while researching this post I discovered this blog post by Madis Kõosaar: Customize GitHub Copilot CLI Status Line . He created a much...

Always know where you stand: Setting up a live status line in GitHub Copilot CLI

If you spend serious time in GitHub Copilot CLI, you've probably had that moment. You're deep in a session, things are moving fast, and suddenly you hit context compaction out of nowhere. The /context and /usage commands help, but they interrupt your flow. What if the information was just there , all the time, without you having to ask? That's exactly where the statusline command can help: a persistent, live bar at the bottom of your CLI session that shows whatever your script prints — token usage, context percentage, current model, cost estimates, session duration, and more. Once it's running, it looks something like this: █████░░░░░ 50% 64.0k/128.0k | ✱ Sonnet 4.5 | ~$0.04 | ⏱️ 00:12:34 This guide walks you through the full setup from scratch, including a "hello world" sanity check. In a follow-up post we’ll tweak the result to example above. Status: Custom status line support requires experimental features enabled in Copilot CLI. You can e...

Get more out of your GitHub Copilot session history with /chronicle

If you've been using GitHub Copilot CLI for a while, you've probably had that Monday morning feeling; staring at your terminal trying to remember exactly what you were doing on Friday. Or maybe you've wondered why some of your Copilot interactions go smoothly while others turn into back-and-forth marathons. Enter /chronicle , an experimental slash command that turns your CLI session history into something genuinely useful. Session history Every time you interact with Copilot CLI, the session data is stored locally on your machine. That's not just a log file — it's a record of your real-world workflow: which branches you worked on, what you tried, when you got stuck, and how you course-corrected. The /chronicle command gives you a structured way to query that history and extract insights you couldn't easily get otherwise. Note: /chronicle is currently an experimental feature. You'll need to run /experimental on (or use the --experimental flag)...