Linq到NHibernate.ContainsAny()解决方案?
我遇到了一个大问题。我有两个目标: IList产品;和 收藏 这两个对象都包含和IList named.Tags 我正试着和Linq一起做这件事 products=products.Wherep=>p.Tags.Anyt=>collection.Tags.Containst 这将给出一个例外,因为Linq到NHibernate不支持这一点。但我如何才能做到这一点?我只是找不到任何聪明的方法来只获取包含特定集合的标签的产品 提前谢谢 顺便说一句,问题似乎非常类似,但在我的场景中,我不想与字符串数组进行比较,而是与poco对象的集合进行比较 [编辑] 我发现它引发了以下异常: 无法将类型为“System.Linq.Expressions.ConstantExpression”的对象强制转换为类型为“System.Linq.Expressions.LambdaExpression” 解决问题的其他方法也很受欢迎,如HQL等 谢谢!Linq到NHibernate.ContainsAny()解决方案?,nhibernate,c#-4.0,linq-to-nhibernate,Nhibernate,C# 4.0,Linq To Nhibernate,我遇到了一个大问题。我有两个目标: IList产品;和 收藏 这两个对象都包含和IList named.Tags 我正试着和Linq一起做这件事 products=products.Wherep=>p.Tags.Anyt=>collection.Tags.Containst 这将给出一个例外,因为Linq到NHibernate不支持这一点。但我如何才能做到这一点?我只是找不到任何聪明的方法来只获取包含特定集合的标签的产品 提前谢谢 顺便说一句,问题似乎非常类似,但在我的场景中,我不想与字符串数组
[/EDIT]集合.标记的基本类型是什么?可能是LINQ to NH不喜欢这种类型,或者它不理解如何访问Tags属性。这行吗
var tags = collection.Tags.ToList();
products = products.Where(p => p.Tags.Any(t => tags.Contains(t)));
好吧,我最终得到了一个有点无聊的解决方案,但它奏效了。如果有人遇到同样的问题:
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();
哦,我正在使用NHibernate 2.1.2替代方法:升级到最新版本和新的linq提供程序。类似的查询也可以工作。Hql应该是可能的,有2.1.2个anks作为您的答案!我已经尝试过了,但是我得到了相同的结果——只要我访问products集合,就会出现一个空异常。代码是编译的,当我请求结果时,它首先在运行时抛出异常。快速更新:我在代码之后添加了一个foreach循环,现在我得到了一个更有趣的异常:无法将“System.Linq.Expressions.ConstantExpression”类型的对象强制转换为“System.Linq.Expressions.LambdaExpression”。