Linq для NHibernate. Содержит любой () обходной путь? - PullRequest
1 голос
/ 23 октября 2010

Я столкнулся с огромной проблемой.Я добрался до этих двух объектов: IList<Product> products; и Collection collection;

Оба объекта содержат и IList<Tag> названы .Tags.

Я пытаюсь сделать это с помощью Linq To NHibernate:

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

Это даст исключение, потому что Linq To NHibernate не поддерживают это.Но как я могу это сделать?Я просто не могу найти какой-либо умный способ получить только products, который содержит теги, которые есть у конкретного collection.

Заранее спасибо!

Кстати, проблема кажется оченьаналогично IQueryable содержит любой из строкового массива , но в моем сценарии я не хочу сравнивать его со строковым массивом, а с коллекцией объектов poco.

[EDIT] Я нашелвыходит, что оно выдает это исключение: Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'System.Linq.Expressions.LambdaExpression'.

Альтернативные способы решения проблемы также приветствуются (HQL и т. д.).

Спасибо![/ EDIT]

Ответы [ 2 ]

1 голос
/ 23 октября 2010

Хорошо, у меня получилось немного скучное решение, но оно работает.Если кто-то столкнулся с той же проблемой:

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 голос
/ 23 октября 2010

Что является базовым типом collection.Tags?Возможно, LINQ to NH не нравится этот тип или что он не понимает доступ к свойству Tags.Это работает?

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