using System.Collections.Generic;
using System.Linq.Expressions;
var listOfItems = new List<(string Key1, int Key2, string Value)>
var keysToFind = new[]{ ("foo", 1), ("bar", 2) };
var foundItems = listOfItems.AsQueryable()
.WhereCompositeKeyContainedIn(
foundItems.Should().BeEquivalentTo(("foo", 1, "A"), ("bar", 2, "D"));
public static class MyExpressions
public static IQueryable<TEntity> WhereCompositeKeyContainedIn<TEntity, TKey1, TKey2>(
this IQueryable<TEntity> query,
Expression<Func<TEntity, TKey1>> key1Expression,
Expression<Func<TEntity, TKey2>> key2Expression,
IEnumerable<(TKey1 Key1, TKey2 Key2)> keysToFind)
var parameter = Expression.Parameter(typeof(TEntity), "i");
Expression predicate = null;
foreach (var key in keysToFind)
var keyPredicate = Expression.AndAlso(
Expression.Equal(key1Expression, Expression.Constant(key.Key1)),
Expression.Equal(key2Expression, Expression.Constant(key.Key2)));
predicate = keyPredicate;
predicate = Expression.OrElse(predicate, keyPredicate);
var lambda = Expression.Lambda<Func<TEntity, bool>>(predicate, parameter);
query = query.Where(lambda);