Прежде всего, небольшое предложение. Я думаю, что для вашего общего вмешательства было бы лучше разоблачить:
IQueryable<T> Query<T>();
Таким образом, прикладной уровень сможет вызывать его и связывать все, что захочет, например:
var temp = repo.Query<User>().Where(c => c.Email.Contains("@foo.com")).OrderBy(c => c.FirstName);
По вашему вопросу я обнаружил, что, когда нет поставщика EF - или вы не можете использовать его по какой-либо причине - NHibernate с Fluent Nhibernate - вполне альтернатива. Не такой мощный, как EF (сначала код, очевидно), но все же хороший запасной вариант. Он поддерживает наиболее распространенные операторы linq и прекрасно впишется в ваш абстрактный дизайн.