2011-10-28 5 views
0

私はしばらくかかっていましたが、私が欲しいものを手に入れる方法を考えました。 私のコード:QueryOver - IDは無料だと思いましたか?

 var sq = QueryOver.Of<VehicleGroup>(() => vehicleGroup) 
        .JoinQueryOver<Manager>(vg => vg.Managers) 
         .Where(man => man.Id == managerId) 
        .JoinQueryOver<TruckPCBase>(() => 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オブジェクトにはVehicleBaseコンポーネントがあります。

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

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

これは、次のエラー得られます:私は何をしたかったことはなかった

System.NullReferenceException: Object reference not set to an instance of an object. 
at lambda_method(ExecutionScope) 

[OK]をので、私は追加のフェッチを追加しました:

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

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

ませサイコロ。私はSummaryクラス(VehicleId)に新しいプロパティを追加したくない - Summary.VehicleBase.Idを通じてアクセスしたい。

提案はありますか?

答えて

0

私は完全にあなたがやろうとしているのか理解できなかったが、問題があるように思われる:

このラインのため

.Where(v => v.Id == item.VehicleBase.Id) 

itemがnullであるため、この例外を得ています。 nhibernateのlinq式評価プログラムは、lambdaパラメータを含まないすべてのものを熱心に評価しようとします。このような場合のために:

v.Id =>は後に評価され、vにHQL item.VehicleBase.Id =>には依存になっていないので、評価者は、NREがスローされますどの熱心にそれを評価します。

+0

したがって、どうすれば依存関係を設定できますか? –

0

var sq = QueryOver.Of<VehicleGroup>() 
    .Inner.JoinAlias(vg => vg.Managers,() => manager) 
    .Where(() => manager.Id == managerId) 
    .JoinQueryOver(x => x.Vehicles,() => vehicle) 
    .Select(x => vehicle.Id) 
    ; 


var vp = Session.QueryOver<Summary>() 
    .Fetch(vpr => vpr.VehicleBase).Eager 
    .WithSubquery.WhereProperty(x => x.VehicleBase.Id).In(sq) 
    .Take(10) 
    .List() 
    ; 

これは私が欲しかったもの(と思う)正確に以下のSQL

SELECT 
    TOP (@p0) this_.summaryID as summaryID42_1_, 
    ... close to 200 columns cut ... 
FROM 
    dbo.Summary this_ 
left outer join 
    dbo.Vehicle vehiclebas2_ 
     on this_.VehicleID = vehiclepcbas2_.VehicleID 
WHERE 
    this_.vehicleID in (
     SELECT 
      vehicle2_.vehicleID as y0_ 
     FROM 
      dbo.Groups this_0_ 
     inner join 
      dbo.Manager_Rel managers4_ 
       on this_0_.groupId=managers4_.groupId 
     inner join 
      dbo.Managers manager1_ 
       on managers4_.managerId=manager1_.ManagerId 
     inner join 
      dbo.Object_Rel vehicles6_ 
       on this_0_.groupId=vehicles6_.groupId 
     inner join 
      dbo.Vehicle vehicle2_ 
       on vehicles6_.ID=vehicle2_.VehicleID 
     WHERE 
      this_0_.type=1 
      AND manager1_.ManagerId = @p1 
    ); 
@p0 = 10 [Type: Int32 (0)], @p1 = 34 [Type: Int32 (0)] 

を生成します。

関連する問題