2010-07-14 4 views
2

Je voudrais avoir l'API suivante pour mon MyTypeRepository:Linq aux détails de mise en œuvre du référentiel NHibernate

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

..et pour le lambda à utiliser utilisé pour construire une requête LINQ dans le référentiel, qui est ensuite Linq utilise NHibernate.

Est-ce possible? À quoi ressemblerait ma méthode FindOne de dépôt?

Répondre

7
public EntityType FindOne<EntityType>(Expression<Func<EntityType,bool>> predicate) 
{ 
    return session.Linq<EntityType>().FirstOrDefault(predicate); 
} 

Je suppose

  1. que votre classe de référentiel a une variable ISession appelée session
  2. que LINQ to NHibernate a une implémentation fonctionnelle de la méthode FirstOrDefault() (parce que je ne l'ai pas testé pour confirmer)

Si votre classe de référentiel a un paramètre de type Repository<EntityType>, vous pouvez omettre le paramètre type de la méthode.

+0

Jay - merci ... – Ben

0

Quelque chose comme ça?

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(); 
0

comme une alternative, here est une interface de dépôt et la mise en œuvre qui expose IQueryable génériques, ICollection et IDictionary interfaces.

Lorsque vous utilisez, vous utilisez juste des méthodes d'extension LINQ pour effectuer des requêtes, à savoir repository.Single(lambda), etc.