У меня есть следующий общий метод расширения:
public static T GetById<T>(this IQueryable<T> collection, Guid id) 
    where T : IEntity
{
    Expression<Func<T, bool>> predicate = e => e.Id == id;
    T entity;
    // Allow reporting more descriptive error messages.
    try
    {
        entity = collection.SingleOrDefault(predicate);
    }
    catch (Exception ex)
    {
        throw new InvalidOperationException(string.Format(
            "There was an error retrieving an {0} with id {1}. {2}",
            typeof(T).Name, id, ex.Message), ex);
    }
    if (entity == null)
    {
        throw new KeyNotFoundException(string.Format(
            "{0} with id {1} was not found.",
            typeof(T).Name, id));
    }
    return entity;
}
К сожалению, Entity Framework не знает, как обращаться с predicate, поскольку С# преобразовал предикат в следующее:
e => ((IEntity)e).Id == id
Entity Framework создает следующее исключение:
Невозможно ввести тип "IEntity" для ввода "SomeEntity". LINQ to Объекты поддерживают только листинг EDM-примитивов или типов перечисления.
Как мы можем заставить Entity Framework работать с нашим интерфейсом IEntity?