我已经陷入了一个巨大的问题。我得到了这两个对象:
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等)。
谢谢! [/编辑]
答案 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();