2010-07-19 5 views
0

À titre d'exemple, disons que vous avez une classe comme telleNHibernate Linq: Contient Déclaration

**Person** 
int PersonID 
string PersonName 
BusinessLocation Locations 

**BusinessLocation** 
string city 
string state 
List<int> ZipCodes 

(en disant que les emplacements peuvent exister dans plusieurs codes postaux)
(ignorant que zipcodes devrait être chaînes au lieu d'ints, ceci est juste un exemple)

Dites que les emplacements des entreprises existent dans plusieurs codes postaux.

Maintenant j'essaye de retirer toutes les personnes dans la table de personne, donné un zipcode d'affaires.

Par exemple, je veux toutes les personnes qui ont un code postal de 32567.

(Compte tenu de la liste des ID, cela fonctionne, je suis en train de faire le contraire, étant donné un ID, je veux une liste des personnes)

public Person GetPersonsByBusinessZipCode(int zipcode) 
{ 
    List<Person> personList = 
     this.GetAllQueryable().Where(
      x => x.Locations.ZipCodes.Contains(zipcode)).ToList(); 
} 

Ceci est mappé comme tel dans Fluent.

HasMany<int>(x => x.ZipCodes) 
    .Table("BusinessLocationsZipCodes") 
    .KeyColumns.Add("BusinessLocationID") 
    .Inverse() 
    .Element("ZipCode") 
    .AsBag() 
    .Cascade.None() 
    .Cache.ReadOnly(); 

BusinessLocationZipCodes est juste une table de référence faisant allusion qu'un BusinessLocation peut avoir plusieurs ZipCodes, d'où le hasMany. Sachant que l'inverse fonctionne, si on me donne une liste de ZipCodes et que j'essaie de trouver BusinessLocations contenues dans la liste des zipcodes fonctionne (tant que le mapping est un zipcode et non une liste de zipcodes). Maintenant, j'essaie juste de trouver le BusinessLocations donné un code postal.

Si quelqu'un a une réponse, je l'apprécierais.

+0

Qu'est-ce qui ne fonctionne pas?Avez-vous une exception, obtenez-vous le mauvais résultat, etc. Quel fournisseur linq utilisez-vous? – Paco

+0

J'utilise Linq pour Nhibernate 1.0, Nhibernate 2.1, et FluentNhibernate 1.0, ce qui ne fonctionne pas, c'est de pouvoir retirer une liste de BusinessLocations en lui donnant un code postal, en utilisant la liste de codes postaux pour Linq. –

+0

Les codes postaux sont-ils insérés avec inverse et cascade aucun? – Paco

Répondre

-1

Le fournisseur Linq ne devrait pas être important tant que vous utilisez System.Linq.Queryable et l'interface IQueryable.

Je crois que vous recherchez la méthode Queryable.Any.

Persons.Where(p => p.Locations.ZipCodes.Any(z => z == zipCode)) 

Ou, si vos personnes ont de nombreux endroits:

IQueryable<Person> query = 
    from p in Persons 
    where 
    (
    from l in p.Locations 
    from z in l.ZipCodes 
    select z 
).Any(z => z == zipCode) 
    select p; 
+0

Merci David, mais avec ce que j'ai reçu une erreur qui a déclaré "Impossible de comprendre y = 32567" –

+0

1. Le fournisseur de linq est important parce qu'ils ont tous les deux des incomplétitions différentes. Celui de NHiberante.Linq.dll est maintenant obsolète. 2. Avec un fournisseur linq entièrement implémenté, cela ne devrait pas poser de problème si vous utilisez Any (x => x == y) ou Contains (y) techniquement. Contient est préféré car il est plus lisible. – Paco

+0

@Matt Braunwart - Je n'ai pas utilisé y dans mon code, donc c'est difficile pour moi de résoudre votre problème. Se pourrait-il que y ait une propriété qui soit plus comparable avec un code postal? Aussi - peut-être == (comparaison) serait plus approprié que = (affectation) –

-1

Quelle est l'exception? Cela devrait fonctionner correctement en utilisant la dernière version de NHibernate (2.1.2.400).

// La requête suivante: (never mind espagnol)

var transporte = // some entity; 
var solicitud = IQueryable<Solicitud> 
        .Where(x => x.SolicitudesDeTransporte.Contains(transporte)).ToList(); 

Génère:

SELECT this_.Id as Id6_0_, 
     /* etc... */ 
FROM Solicitud this_ 
WHERE this_.Id in (SELECT this_0_.Id as y0_ 
        FROM Solicitud this_0_ 
          left outer join Solicitud_Transporte solicitude1_ 
          on this_0_.Id = solicitude1_.Id_Solicitud 
        WHERE solicitude1_.Id = 1 /* :p0 */) 
+0

L'exception que je reçois est une référence null objet. Mais je peux obtenir la liste de ZipCodes, c'est juste qu'il ne me laissera pas interroger plus loin dans la liste en utilisant le contenu. (C'est quand il jette l'exception) –

+0

Une différence entre votre requête et la requête publiée est que vous utilisez une entité (avec id) dans le contient et dans la question un objet de valeur (sans id) est utilisé. – Paco

+0

@Matt Braunwart: qu'est-ce que null qui ne devrait pas être nul? – Paco

0

Paco, apparemment, je foiré parce que j'avais deux comptes flottant ici que je ne l'ai pas savoir, donc c'est mon OpenID. Quoi qu'il en soit, je ne suis pas sûr de l'exception NullReferenceException, il plonge dans les espaces de noms NHibernate sans aucun lien avec l'une des classes avec lesquelles je travaille. Mais je reçois seulement l'exception NullReferenceException quand j'essaie de plonger dedans en utilisant Contient. Comme je l'indique ci-dessus, je ne reçois pas l'exception NullReferenceException si je ne fais que ramener la liste des ZipCodes. Donc, ma cartographie fonctionne, mais il ne semble pas pouvoir me renvoyer une liste de BusinessLocations basée sur l'instruction Contient.

+0

Je suis désolé, pas correctement indiqué, le seul lien retour est à la classe avec laquelle je travaille, le référentiel, qui appelle l'appel. – MattB