Определите интерфейсы, которые позволят вам сделать это. Например:
public interface IEntity
{
DateTime CreatedAt { get; set; }
string CreatedBy { get; set; }
}
Вам необходимо «внедрить» этот интерфейс в ваши сущности. Например, вы можете либо изменить объекты, генерирующие шаблоны T4, либо реализовать их в частичном классе. Оба свойства должны быть уже определены в модели, поэтому реализация является только декларативной:
public partial class MyEntity : IEntity // That's all
{ }
Теперь вы можете определить Store
как:
public void Store<TEntity>(TEntity entity) where TEntity : IEntity
{
...
}
То же самое можно сделать с запросом, но вы можете, например, определить собственный метод расширения:
public static IQueryable<TEntity> GetUserEntities(this IQueryable<TEntity> query, string user)
where TEntity : IEntity
{
return query.Where(e => e.CreatedBy == user);
}
Вы просто определите свой запрос как:
var result = myEntityContext.MyEntities.GetUserEntities("someName");
Другой подход - просто определить GetQuery в вашем пользовательском контексте:
public IQueryable<T> GetQuery<T>() where T : IEntity
{
var query = GetObjectSetSomehow;
return query.ApplyGlobalConditions(); // Just another extension with your conditions
}
Я не большой поклонник шаблона репозитория, но обычно то, что вы пытаетесь сделать, близко к универсальному репозиторию, поэтому проверьте, например, этот пост . Это всего лишь пример, который можно расширить.