2010-10-23 50 views
1

我已经撞到了一个巨大的问题。我到这两个对象: IList<Product> products;Collection collection;Linq以NHibernate .ContainsAny()解决方法?

两个对象都包含和IList<Tag>命名.tags添加。

我试图使用LINQ to NHibernate的做这样的:

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

这会给一个例外,因为LINQ的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等)。

谢谢! [/编辑]

+0

哦,我使用NHibernate 2.1.2 – jhovgaard 2010-10-23 14:03:09

+0

替代办法:升级到最新版本,新的LINQ提供程序。类似的查询工作。 Hql应该可以用2.1.2 – Paco 2010-10-23 18:54:57

回答

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

什么是collection.Tags的基本类型?可能是LINQ to NH不喜欢这种类型,或者它不明白访问Tags属性。这是否工作?

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

感谢您的回答!我试过了,但是我获得了相同的结果 - 只要访问产品集合,就会发生空例外情况。代码编译时,它首先在运行时(当我请求结果时)抛出异常。 – jhovgaard 2010-10-23 14:34:05

+0

快速更新: 我在代码后添加了一个foreach循环,现在我得到了一个更有趣的异常:无法将类型为“System.Linq.Expressions.ConstantExpression”的对象转换为键入“System.Linq.Expressions.LambdaExpression” 。 – jhovgaard 2010-10-23 14:40:46