Linq到NHibernate .ContainsAny()解决方法?

时间:2010-10-23 13:55:41

标签: nhibernate c#-4.0 linq-to-nhibernate

我已经陷入了一个巨大的问题。我得到了这两个对象: IList<Product> products;Collection collection;

两个对象都包含名为.Tags的IList<Tag>

我正在尝试使用Linq To NHibernate执行此操作:

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

这会给出一个例外,因为Linq To NHibernate不支持这个。但是我怎么能做到这一点呢?我找不到任何智能方法来仅获取包含特定products所拥有的代码的collection

提前致谢!

顺便说一句,问题似乎与IQueryable contains any of string array非常相似,但在我的场景中,我不想与字符串数组进行比较,而是与poco对象的集合进行比较。

[编辑] 我发现它抛出了这个异常: Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'System.Linq.Expressions.LambdaExpression'.

欢迎解决此问题的其他方法(HQL等)。

谢谢! [/编辑]

2 个答案:

答案 0 :(得分:1)

collection.Tags的基本类型是什么?可能是LINQ to NH不喜欢该类型,或者它不理解访问Tags属性。这有用吗?

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

答案 1 :(得分:1)

好吧,我最终得到了一个有点无聊的解决方案,但它确实有效。如果有人遇到同样的问题:

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