2011-10-27 3 views
2

私は奇妙な関係があります。複合語(私にとって)QueryOver

3クラス:マネージャー、グループ、自動車

グループはマネージャーと車の両方に多くの多くのがありますが、どちらもマネージャーも車両がグループ(一方向のみマッピング)について何を知っています。

私はManagerIDを持っています。私は、指定されたIDを持つマネージャを持つグループ内にあるVehicleIDを持つTタイプの別個のリスト項目を取得したい。

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

ここで何ですか?

Ok、いくつかの追加情報: "Manager"はグループにマップされていません。 「車両」はグループにマップされていません。 グループには多数のマネージャがあります グループには多くの車両があります マネージャは複数のグループから参照できます。 車両は複数のグループで管理することができます。

私はマネージャ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 
     ) 

グループの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 
    ); 

だから、私が近づいてきています。

答えて

0

あなたが何をしているかは次のようなものだと思います。

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

[OK] - ほとんど解決策を得ました。私は別の質問をするつもりです。少し不便です。

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に追加する必要がありましたが、これは私がやりたいことではありませんが、今のところそれができます。

関連する問題