using System.Collections.Generic;
using System.Linq.Expressions;
public User Author {get;set;}
public static void Main()
var user1 = new User { ID = 1 };
var user2 = new User { ID = 2 };
var absences = (new List<Absence>() { new Absence { ID = 100, Author = user2 }, new Absence { ID = 200, Author = user1 } }).AsQueryable();
Expression<Func<Absence, bool>> a = (x) => x.Author.ID == currentUserID;
ParameterExpression pe = Expression.Parameter(typeof(Absence), "x");
Expression accessAuthor = Expression.Property(pe, typeof(Absence).GetProperty("Author"));
Expression accessID = Expression.Property(accessAuthor, typeof(User).GetProperty("ID"));
Expression currentUserIDExpression = Expression.Constant(currentUserID, typeof(int));
Expression equalExpression = Expression.Equal(accessID, currentUserIDExpression);
Expression lambda = Expression.Lambda<Func<Absence, bool>>(equalExpression, new ParameterExpression[] { pe });
Console.WriteLine(a.ToString());
Console.WriteLine("---------------------");
Console.WriteLine("accessAuthor: " + accessAuthor.ToString());
Console.WriteLine("accessID: " + accessID.ToString());
Console.WriteLine("currentUserIDExpression: " + currentUserIDExpression.ToString());
Console.WriteLine("equalExpression: " + equalExpression.ToString());
Console.WriteLine("lambda: " + lambda.ToString());
Console.WriteLine("---------------------");
var result1 = absences.FirstOrDefault(a);
Console.WriteLine("result1: " + result1.ID);
var result2 = absences.FirstOrDefault(lambda as Expression<Func<Absence, bool>>);
Console.WriteLine("result2: " + result2.ID);