2010-11-09 7 views
1

Supposons que je cours Foo et Bar comme suit:problème dynamique de requêtes LINQ to NHibernate

public class Foo 
{ 
public string F1 {set; get;} 
public string F2 {set; get;} 

public Bar ContainerBar {set; get;} 
} 

public class Bar 
{ 
public string B1 {set; get;} 
public string B2 {set; get;} 

public List<Foo> Foos {set; get;} 
} 

Après la requête LINQ contient des erreurs disant que foo ne contient pas une propriété nommée F1.

var query = from foo in session.Linq<Foo>() 
       select foo.ContainerBar; 

query = query.Where(foo => foo.F1 == "abcdef"); 

Je sais foo dans la deuxième déclaration est vraiment une Bar parce que la requête sélectionne ContainerBar.

La question est de savoir comment puis-je ajouter une clause dynamic where à interroger sans changer la requête origianl? Le but final est d'avoir des sous-requêtes avec linq-to-nhibernate.

Répondre

3
var query = from foo in session.Linq<Foo>() 
       select foo.ContainerBar; 

query = query.Where(foo => foo.F1 == "abcdef"); 

Votre objet "requête" est maintenant un IQueryable de ce ContainerBar Alors, quand vous faites le Où (foo => foo.f1 == "abcdef"), il est fait sur IQueryable, donc pas de propriété de F1.

Vous devriez faire:

var bars = from foo in session.Linq<Foo>() 
      where foo.F1 == "abcdef" 
      select foo.ContainerBar; 

Ou:

var q = session.Linq<Foo>(); 

// if some condition 
q = q.Where(foo => foo.F1 == "abcdef"); 

var bars = q.Select(foo => foo.ContainerBar); 
+0

mais où la clause doit être ajoutée lors de l'exécution. –

+0

J'ai mis à jour ma réponse – mathieu

0

Utilisez-vous NHibernate 3.0? La première requête ne fonctionne pas pour moi (NHibernate 2.1.2.4000, cast invalide). Cependant, il semble que vous essayez d'obtenir tous les bars qui ont Foos, qui peut être fait comme ça ...

IQueryable<Bar> bars = Session 
    .Linq<Bar>() 
    .Where(bar => bar.Foos.Any()); 

Maintenant que vous avez les bars, dans votre code plus tard, vous pouvez vérifier F1 comme celui-ci ...

var result = bars 
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b")); 
+0

Non, j'utilise NHibernate 2.1.2 –