У меня есть следующий (сильно сокращенный) общий класс репозитория:Как запросить DbSet со строкой 'where clause'?
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
private DbSet<TEntity> _entitySet;
private NewExternalsContext _dbContect;
public Repository(NewExternalsContext dbContext)
{
_dbContect = dbContext;
_entitySet = _dbContect.Set<TEntity>();
}
public virtual TEntity Get(object objectId)
{
// TODO Figure out how to use 'id' to build an Expression<Func<TEntity, bool>>.
throw new NotImplementedException();
}
public virtual TEntity FindOne(Expression<Func<TEntity, bool>> where)
{
return _entitySet.FirstOrDefault(where);
}
}
Моя проблема с методом public virtual TEntity Get(object objectId)
является то, что, поскольку хранилище является общим, я не знаю, что TEntity
имеет какое-либо поле идентификатора, или что это называется. Лучшее, что я могу сделать, это проверить, имеет ли он поле Id
, самое распространенное имя для полей id. Затем, как я, например, do say _entitySet.Where("Id = " + objectId)
? У меня есть метод public virtual TEntity FindOne(Expression<Func<TEntity, bool>> where)
, но когда я просто хочу получить объект по id
, как это обычно бывает, я не хочу выписывать целое лямбда-выражение.
Класс DbSet имеет [Найти метод] (http://msdn.microsoft.com/en-us/library/gg696418 (v = vs.103) .aspx), который делает то, что вы хотите. Он находит объекты на основе первичного ключа. – nemesv