У меня есть ситуация, в которой я должен сделать несколько вложенных выборок и проверить, удовлетворяет ли конкретное условие, думаю, у меня есть объекты, подобные ниже:
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.