Created
July 15, 2025 12:57
-
-
Save erinnmclaughlin/1c492e38b160c885769b6daceff27a17 to your computer and use it in GitHub Desktop.
Expressions & EF Core
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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