2010-10-23 7 views
1

J'ai plongé dans un énorme problème. Je suis arrivé à ces deux objets: IList<Product> products; et Collection collection;Linq to NHibernate .ContainsAny() solution de contournement?

Les deux objets et contient IList<Tag> .Tags nommés.

Je suis en train de faire cela avec la Linq Pour NHibernate:

products = products.Where(p => p.Tags.Any(t => collection.Tags.Contains(t)));

Cela donnera une exception, car Linq Pour NHibernate ne supportent pas cela. Mais comment puis-je accomplir cela? Je ne peux pas trouver une manière intelligente d'obtenir seulement le products qui contient les étiquettes que le collection a.

Merci d'avance! Btw, le problème semble très similaire à IQueryable contains any of string array, mais dans mon scénario, je ne veux pas comparer avec un tableau de chaînes, mais avec une collection d'objets poco.

[EDIT] Je trouve que cela jette cette exception: Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'System.Linq.Expressions.LambdaExpression'.

D'autres moyens pour résoudre le problème est trop bienvenu (HQL etc).

Merci! [/ EDIT]

+0

Oh, et je suis en utilisant NHibernate 2.1.2 – jhovgaard

+0

façon alternative: mise à niveau vers la dernière version et le nouveau fournisseur de LINQ. Des requêtes similaires fonctionnent. Hql devrait être possible avec 2.1.2 – Paco

Répondre

1

D'accord, je me suis retrouvé avec une solution un peu ennuyeuse, mais cela fonctionne. Si quelqu'un a frappé le même problème:

products = _productRepository.Session() 
          .CreateSQLQuery(
          @"SELECT {p.*} 
           FROM Products p 
           WHERE (SELECT COUNT(TagId) 
             FROM ProductTags 
             WHERE ProductId = p.Id 
             AND TagId IN (SELECT TagId 
                FROM CollectionTags 
                WHERE CollectionId = :collectionId)) > 0 
           AND (ShopId = :shopId)") 
           .AddEntity("p", typeof(Product)) 
           .SetInt32("collectionId", collection.Id) 
           .SetInt32("shopId", collection.Shop.Id) 
           .SetResultTransformer(NHibernate.Transform.Transformers.DistinctRootEntity) 
           .List<Product>().AsQueryable(); 
1

Quel est le type sous-jacent de collection.Tags? Il se peut que LINQ to NH n'aime pas ce type ou qu'il ne comprend pas l'accès à la propriété Tags. Est-ce que ça marche?

var tags = collection.Tags.ToList(); 
products = products.Where(p => p.Tags.Any(t => tags.Contains(t))); 
+0

Merci pour votre réponse! Je l'ai essayé, mais j'ai le même résultat - une exception nulle dès que j'accède à la collection de produits. Le code compile, c'est d'abord à l'exécution (quand je demande les résultats) il lève l'exception. – jhovgaard

+0

Une mise à jour rapide: J'ai ajouté une boucle foreach après votre code, et maintenant je reçois une exception plus intéressante: Impossible de lancer l'objet de type 'System.Linq.Expressions.ConstantExpression' pour taper 'System.Linq.Expressions.LambdaExpression' . – jhovgaard

Questions connexes