复杂(对我来说)QueryOver

时间:2011-10-27 23:49:24

标签: nhibernate queryover

我有一种奇怪的关系。

3个班级:经理,小组,车辆

Group对于Manager和Vehicle都有多对多,但Manager和Vehicle都不知道有关Group的任何信息(只有单向映射)。

我有一个ManagerID。我想获得一个类型为T的不同列表项,其中的VehicleID位于具有指定ID管理器的组中。

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

现在是什么?

好的,一些进一步的信息: “经理”未映射到组。 “车辆”未映射到组。 集团有很多经理人 集团有很多车辆 管理员可以由多个组引用。 车辆可由多个组管理。

我有经理ID。我想从拥有该经理的小组中获取不同车辆的清单。

============================================

确定。更多: 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
        )

有两种类型的群组。司机(类型= 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 :(得分:0)

我认为你所追求的是以下内容。

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

答案 1 :(得分:0)

好的 - 大部分都有解决方案。我将提出另一个问题的轻微不便:

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,这不是我想要做的,但它现在会做。