2010-10-23 5 views
1

Я врезался в огромную проблему. У меня к этим двум объектам: IList<Product> products; и Collection collection;Linq to NHibernate. ПоддерживаетAny() обходной путь?

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

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

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

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

Заранее благодарен!

Btw проблема кажется очень похожей на IQueryable contains any of string array, но в моем сценарии я не хочу сравнивать со строковым массивом, но с коллекцией объектов poco.

[EDIT] я узнал, что он бросает это исключение: Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'System.Linq.Expressions.LambdaExpression'.

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

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

+0

О, и я использую NHibernate 2.1.2 – jhovgaard

+0

Альтернативный способ: обновление до последней версии и нового поставщика Linq. Аналогичные запросы работают. Hql должно быть возможным с 2.1.2 – Paco

ответ

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

+0

Быстрое обновление: Я добавил цикл foreach после вашего кода, и теперь я получаю более интересное исключение: невозможно лить объект типа «System.Linq.Expressions.ConstantExpression» для ввода «System.Linq.Expressions.LambdaExpression» , – jhovgaard