0

У меня есть следующий (сильно сокращенный) общий класс репозитория:Как запросить 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, как это обычно бывает, я не хочу выписывать целое лямбда-выражение.

+1

Класс DbSet имеет [Найти метод] (http://msdn.microsoft.com/en-us/library/gg696418 (v = vs.103) .aspx), который делает то, что вы хотите. Он находит объекты на основе первичного ключа. – nemesv

ответ

0

Вам нужно будет создать еще один метод, который возвращает вам объект, как в этом вопросе: How to get ObjectSet<T>'s entity key name?, вы можете обмануть немного и получить объект по идентификатору, как показано ниже:

public T GetById(int id) 
    { 
     var keyPropertyName =_objectSet.EntitySet.ElementType.KeyMembers[0].ToString();   
     T entity = _objectSet.Where("it." + keyPropertyName + "=" + id).First(); 
     return entity; 
    } 
+0

Спасибо, но в другом чтении сказано, что преобразовать DdSet в ObjectSet , и я использую DbSets. В противном случае это выглядит круто. – ProfK