Какова эквивалентность SelectMany в linq2nhibernate, чтобы предотвратить исключение приведения? - PullRequest
1 голос
/ 28 декабря 2010

У меня есть ситуация, в которой я должен сделать несколько вложенных выборок и проверить, удовлетворяет ли конкретное условие, думаю, у меня есть объекты, подобные ниже:

Class A
{
  IList<B> Bs;
}

Class B
{
  IList<C> Cs;
}

Class C
{
   bool value;
}

Теперь я хочу проверить, содержит ли a b , содержит ли c со значением true что-то подобное в linq:

if (AList.Any(x=>x.Bs.Any(y=>y.Cs.Any(z=>z.value)))
  MessageBox.Show(".... nhibernate");

но с nhibernate я не могу этого сделать (исключение - значение не может быть нулевым, и это будет сделано при создании дерева выражений, а не моих значений). Поэтому я изменил его, чтобы использовать SelectMany для выборки данных (последние данные на самом деле имеет значение int и не очень велико, чтобы вызывать проблемы с производительностью) и выполнить локально для него linq2object, но известная проблема, такая как в , этот URL будет иметь место, и я могу ' не понимаю, что мне делать, Самый простой из них:

        var ret = PersistenceManager.Context<A>()
        .SelectMany(o => o.Bs, (o,r)=>r).AsEnumerable(); 
        // (o,r)=>r try define type but no effect

теперь, если вы протестируете ret.Count ... вы получите исключение

'ret.Count()' threw an exception of type 'NHibernate.LazyInitializationException'    
 int {NHibernate.LazyInitializationException}. 

и если вы просто осмотрите

  var ret = PersistenceManager.Context<A>()
           .SelectMany(o => o.Bs).AsEnumerable();

теперь, если вы протестируете ret.Count ... вы получите исключение can not cast A to B

Есть ли способ преобразовать это выражение SelectMany или использовать выражение Any выше? Надеюсь, читатель поймет, почему я ищу SelectMany или любую другую идею для решения этой проблемы?

PersistenceManager.Context<A> похож на IEnumerable<A> объект.

Моя версия nhibernate - 2.1.2.400.

...