Question

Supposons que j'ai des classes Foo et Bar comme suit:

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 un Bar parce que de requête de ContainerBar.

La question est de savoir comment puis-je ajouter une dynamique où la clause de requête sans modifier la requête origianl? Objectif final est d'avoir des sous-requêtes avec LINQ to NHibernate.

Était-ce utile?

La solution

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 ContainerBar de Alors, quand vous faites le Où (foo => foo.f1 == "abcdef"), il est fait sur IQueryable, donc pas de propriété de F1.

Vous devez 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 );

Autres conseils

Utilisez-vous NHibernate 3.0? La première requête ne fonctionne pas pour moi (NHibernate 2.1.2.4000, fonte non valide). 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 ça ...

var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top