Skip to content

Instantly share code, notes, and snippets.

@hagbarddenstore
Created March 11, 2015 08:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hagbarddenstore/00a8226ddd933e98196d to your computer and use it in GitHub Desktop.
Save hagbarddenstore/00a8226ddd933e98196d to your computer and use it in GitHub Desktop.
List<Customer> _customers = new List<Customer>
{
new Customer { Id = 1, Name = "Customer1" },
new Customer { Id = 2, Name = "Customer2" },
new Customer { Id = 3, Name = "Customer3" },
new Customer { Id = 4, Name = "Customer4" },
new Customer { Id = 5, Name = "Customer5" },
new Customer { Id = 6, Name = "Customer6" },
};
void Main()
{
var customer = Find(_customers, new Customer { Id = 2, Name = "Customer2" });
if (customer != null)
{
Console.WriteLine(customer.Name);
}
else
{
Console.WriteLine("Didn't find any!");
}
}
T Find<T>(IEnumerable<T> items, T query)
{
var keys = new[] { "Id", "Name" };
var expressions = new List<Expression>();
var parameter = Expression.Parameter(typeof(T), "x");
foreach (var key in keys)
{
var property = typeof(T).GetProperty(key, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);
if (property == null)
{
continue;
}
var value = property.GetValue(query);
var expression = Expression.Equal(Expression.Property(parameter, key), Expression.Constant(value));
expressions.Add(expression);
}
var and = expressions.Aggregate((left, right) => Expression.AndAlso(left, right));
var lambda = Expression.Lambda<Func<T, bool>>(and, parameter);
// return items.FirstOrDefault(lambda);
return Enumerable.FirstOrDefault(items, lambda.Compile());
}
class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment