У меня странные отношения.
3 класса: Менеджер, Группа, Транспортное средство
В группе есть много ко многим и Менеджеру, и Транспортному средству, но ни Менеджер, ни Транспортное средство ничего не знают о Группе(только одностороннее сопоставление).
У меня есть ManagerID.Я хочу получить отдельный список элементов типа T с идентификатором VehicleID в группе, в которой есть менеджер с указанным идентификатором.
var vehicles = Session.QueryOver<Group>(() => group)
.Right.JoinQueryOver<Manager>(x => x.Managers)
.Where(x => x.Id == managerID)
.Select(Projections.Distinct(Projections.Property<VehicleGroup>(g => g.Vehicles)))
.List<Vehicle>()
;
Что теперь?
Хорошо, некоторыеДополнительная информация: «Менеджер» не сопоставлен с группами.«Транспортное средство» не отображается на группы.В группе много менеджеров. В группе много автомобилей. На менеджера могут ссылаться несколько групп.Транспортным средством можно управлять несколькими группами.
У меня есть идентификатор менеджера.Я хочу получить список различных транспортных средств из групп, в которых есть этот менеджер.
===========================================
Хорошо.Подробнее: SQL Я хочу эмулировать:
select * from Summary
where [vehicleID] in
(
select [vehicleID] from [Managers]
inner join [Manager_Groups] on [Managers].[managerID] = [Manager_Groups].[managerID]
inner join [Groups] on [Manager_Groups].[groupID] = [Groups].[groupID]
inner join [Groups_Object] on [Groups].[groupID] = [Groups_Object].[groupID]
inner join [Vehicle] on [Groups_Object].[ID] = [Vehicle].[vehicleId]
where [Managers].[ManagerId] = 34 and [Groups].[type] = 1
)
Существует 2 типа групп.Водители (тип = 0) и транспортные средства (тип = 1)
Пока у меня есть:
var sq = QueryOver.Of<Manager>(() => manager)
.Where(mf => mf.Id == managerId)
.Fetch(mf => mf.ManagedVehicleGroups).Eager
.TransformUsing(Transformers.DistinctRootEntity)
.JoinQueryOver<VehicleGroup>(mf => mf.ManagedVehicleGroups)
.SelectList(list => list.Select(mf => mf.ManagedVehicleGroups))
;
var vp = Session.QueryOver<VehiclePerformanceDay>(() => item)
.WithSubquery.WhereExists(sq)
.Take(10)
.List();
И это генерирует:
SELECT
TOP (10) this_. ~~~lots of fields removed~~~
FROM
dbo.Summary this_
WHERE
exists (
SELECT
this_0_.ManagerId as y0_
FROM
dbo.Managers this_0_
inner join
dbo.Manager_Groups managedveh3_
on this_0_.ManagerId=managedveh3_.managerID
inner join
dbo.Groups vehiclegro1_
on managedveh3_.groupID=vehiclegro1_.groupId
WHERE
this_0_.ManagerId = 34
);
Итак, явсе ближе.