Комплекс (для меня) QueryOver - PullRequest
       1

Комплекс (для меня) QueryOver

2 голосов
/ 28 октября 2011

У меня странные отношения.

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
    );

Итак, явсе ближе.

Ответы [ 2 ]

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

Хорошо - в основном есть решение. Незначительные неудобства, которые я задам еще на один вопрос:

var sq = QueryOver.Of<VehicleGroup>(() => vehicleGroup)
    .JoinQueryOver<Manager>(vg => vg.Managers)
        .Where(man => man.Id == managerId)
    .JoinQueryOver<VehicleBase>(() => vehicleGroup.Vehicles)
        .Where(v => v.Id == item.VehicleId)
    .Select(vg => vg.Id)
    ;

var vp = Session.QueryOver<Summary>(() => item)
    .WithSubquery.WhereExists(sq)
    .Take(10)
    .List();

Итак, это работает. Тем не менее, мне пришлось добавить карту в Summary.VehicleId, что я не хотел делать, но пока подойдет.

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

Я думаю, что вы ищете что-то вроде следующего.

var list = session.QueryOver<Group>()
    .Where(x => x.Manager.Id == managerID)
    .Select(group=> group.Vehicle)
    .TransformUsing(Transformers.DistinctRootEntity)
    .List<Vehicle>();
...