Skip to content

Instantly share code, notes, and snippets.

@erinnmclaughlin
Created July 15, 2025 12:57
Show Gist options
  • Select an option

  • Save erinnmclaughlin/1c492e38b160c885769b6daceff27a17 to your computer and use it in GitHub Desktop.

Select an option

Save erinnmclaughlin/1c492e38b160c885769b6daceff27a17 to your computer and use it in GitHub Desktop.
Expressions & EF Core
using System.Linq.Expressions;
using System.Text;
using Dumpify;
string[] abc = ["a", "b", "c"];
var q1 = abc.AsQueryable();
Console.WriteLine(q1.Expression);
q1.Expression.Dump();
var q2 = q1.Where(x => x == "a");
Console.WriteLine(q2.Expression);
q2.Expression.Dump();
var q3 = q2.Select(x => $"Hello, {x}!");
Console.WriteLine(q3.Expression);
q3.Expression.Dump();
var q5 = new List<Entity>().AsQueryable().Select(x => x.Name);
Console.WriteLine(q5.Expression);
q5.Expression.Dump();
var sqlVisitor = new SqlExpressionVisitor();
sqlVisitor.Visit(q5.Expression);
Console.WriteLine(sqlVisitor);
var q6 = q5.Where(x => abc.Contains(x));
Console.WriteLine(q6.Expression);
q6.Expression.Dump();
var q7 = new List<Entity>().AsQueryable().Where(x => x.NameContains("a"));
Console.WriteLine(q7.Expression);
q7.Expression.Dump();
var q8 = new List<Entity>().AsQueryable().Where(Entity.NameContainsExpression("a"));
Console.WriteLine(q8.Expression);
q8.Expression.Dump();
return;
class Entity
{
public int Id { get; set; }
public string Name { get; set; } = "";
public bool NameContains(string text) => Name.Contains(text);
public static Expression<Func<Entity, bool>> NameContainsExpression(string text) => e => e.Name.Contains(text);
}
// this is a VERY SIMPLIFIED example of what EF does:
class SqlExpressionVisitor : ExpressionVisitor
{
private readonly StringBuilder _sqlBuilder = new();
public override string ToString() => _sqlBuilder.ToString();
protected override Expression VisitLambda<T>(Expression<T> node)
{
_sqlBuilder.Append("SELECT ");
var result = base.VisitLambda(node);
_sqlBuilder.Append(" FROM ");
_sqlBuilder.Append(node.Parameters[0].Type.Name);
return result;
}
protected override Expression VisitMember(MemberExpression node)
{
_sqlBuilder.Append(node.Member.Name);
return base.VisitMember(node);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment