2012-02-14 3 views
2

Скажите, что у меня есть таблица A, в которой много таблиц B. Таблица B имеет только одну таблицу A.Как фильтровать коллекцию коллекции в linq?

Теперь скажите, что таблица B имеет свойство Name. Как я могу сделать следующее в linq.

Получить все таблицы А, где таблица B имеет имя == «боб», то получите всю таблицу Б в таблице А.

Пример

Table B 
Name TableA_Id 
bob 1 
bob 1 
bob 1 
jim 1 
jon 2 

Так что, если я бы запрос я хотел бы одну таблицу Объект назад с тремя объектами таблицы B внутри него.

Я попытался

session.Query<TableB>().where(x => x.Name == "bob").select(x => x.TableA) 

session.Query<TableA>().where(x => x.TableB.where(d => d.Name == "bob") // can't do this since it is a collection 

Я не могу сделать что-либо из них, поскольку это либо не компилировать или возвращает Для многих TableA (я думаю), что дает мне неожиданные результаты.

+0

Я только использовал EF и не NHibernate, так что я не буду отправлять это как ответ, так как это предположение, но вы можете сделать: '.Query (). Где (a => a.TableB.Any (b => b.Name == "bob")) '? – Ocelot20

+0

Хм, похоже, это сработало (по-прежнему нужно его проверить). Может быть, я неправильно понял Любые, когда я проверил это и подумал, что если будет найден один результат, что все вернется. – chobo2

+0

Правильно - если найден один результат (данный A имеет любое значение TableB.Name == "bob"), он будет включен. Все A без TableB с именем «bob» будут отброшены. –

ответ

2

Я считаю, что вы можете сделать:

var tableBs = session.Query<TableA>() 
        .Where(a => a.TableBs.Any(b => b.Name == "bob")) 
        .SelectMany(a => a.TableBs); 
Смежные вопросы