Присоединиться к заявлению для списка - PullRequest
10 голосов
/ 07 октября 2011

У меня есть таблица на C # и ASP.net, которая ссылается на список другой таблицы, в которой несколько владельцев транспорта отображаются на один автомобиль.Я не хочу просматривать всю коллекцию владельцев транспортных средств, получая доступ к их отдельным членам (например, vehicleRegistrantsAlias[0]), потому что я не знаю, сколько их будет.

Нужно ли делать это в два раза?запросы?Я действительно хотел бы сделать все это в одном.У меня есть родительский класс в качестве транспортного средства и детская коллекция владельцев транспортных средств.Регистрант транспортного средства является базовым типом, а регистратор транспортного средства является владельцем и оператором.Я также хочу получить информацию из других дочерних таблиц.Я присоединяюсь от транспортного средства до транспортных средств, который работает отлично;Тем не менее, я также хочу, чтобы вытащить владельца и операнда.

Vehicle vehicleAlias = null;
List<VehicleRegistration> vehicleRegistrationsAlias = null; 
List<VehicleRegistrant> vehicleRegistrantsAlias = null; 

.JoinAlias(() => vehicleAlias.VehicleRegistrations, () => vehicleRegistrationsAlias)
.JoinAlias(() => vehicleAlias.VehicleRegistrants, () => vehicleRegistrantsAlias)

//from vehicle registrants
.JoinAlias(() => vehicleRegistrantsAlias[0]., () => vehicleSuspensionTypeAlias)

Ответы [ 2 ]

2 голосов
/ 15 августа 2012

Вы также можете использовать LINQ для NHibernate, обычно это облегчает понимание запросов, чем API QueryOver.

Судя по комментариям, вам нужна функция со следующей подписью:

public Vehicle GetVehicle(VehicleRegistrant registrant)
{
    var vehicle = session.Query<Vehicle>()
                         .FetchMany(x => x.VehicleRegistrants)
                         .ThenFetch(x => x.Owner)
                         .Where(x => x.VehicleRegistrants.Contains(registrant))
                         .SingleOrDefault();
}

Или, если у вас есть отношение в направлении от VehicleRegistrant к его родителю Vehicle, это также будет работать

public Vehicle GetVehicle(VehicleRegistrant registrant)
{
    var vehicle = session.Query<Vehicle>()
                         .FetchMany(x => x.VehicleRegistrants)
                         .ThenFetch(x => x.Owner)
                         .Where(x => x == registrant.Vehicle)
                         .SingleOrDefault();
}

Я не уверен, что это именно то, что вы хотели, но я верю, что вы поняли идею. FetchMany(x => x.VehicleRegistrants) указывает NHibernate также извлечь все VehicleRegistrants для каждого Vehicle в наборе результатов, а следующие ThenFetch(x => x.Owner) говорит "и для каждого из этих VehicleRegistrants также извлечь его Owner".

Помогает ли это?

0 голосов
/ 17 октября 2011

Измените переменные на:

    VehicleRegistration vehicleRegistrationsAlias = null; 
    VehicleRegistrant vehicleRegistrantsAlias = null; 

Измените строки JoinAlias ​​на:

.JoinAlias(() => vehicleAlias.VehicleRegistrations, () => vehicleRegistrationsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.JoinAlias(() => vehicleAlias.VehicleRegistrants, () => vehicleRegistrantsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)

И запрос будет с нетерпением вызываться.

Также вызовите перед списком:

.TransformUsing(Transformers.DistinctRootEntity)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...