Детали реализации Linq в NHibernate - PullRequest
2 голосов
/ 14 июля 2010

Я хотел бы иметь следующий API для моего MyTypeRepository:

var myChosenInstance = _myRepository.FindOne(x => x.MyProperty == "MyValue");

.. и для использования лямбды, используемой для построения запроса linq в репозитории, который затем используется Linq для NHibernate.

Возможно ли это? Как будет выглядеть метод FindOne моего хранилища?

Ответы [ 3 ]

7 голосов
/ 14 июля 2010
public EntityType FindOne<EntityType>(Expression<Func<EntityType,bool>> predicate)
{
    return session.Linq<EntityType>().FirstOrDefault(predicate);
}

Я предполагаю

  1. , что в вашем классе хранилища есть переменная ISession с именем session
  2. , в которой Linq-To-NHibernate имеет работающую реализациюметод FirstOrDefault() (потому что я не проверял его для подтверждения)

Если ваш класс репозитория имеет параметр типа Repository<EntityType>, вы можете пропустить параметр типа из метода.

0 голосов
/ 14 июля 2010

В качестве альтернативы, здесь - это интерфейс и реализация репозитория, которые предоставляют универсальные интерфейсы IQueryable, ICollection и IDictionary.

При использовании этого вы просто используете методы запросов LINQ для запросов, т. Е. repository.Single(lambda) и т. Д.

0 голосов
/ 14 июля 2010

Как то так?

var f = new Func<MyType, bool>(x => x.MyProperty == "MyValue");
var query = from t in session.Linq<MyType>() 
            where f.Invoke(t) 
            select new { Id = c.Id, Name = c.Name };
//or...
var query = from c in collection 
            .Where(f) 
            select new { Id = c.Id, Name = c.Name };
var results = query.Single();
...