2017-03-18 20 views
2

私は初心者のnhibernateです。使用してみてください。エンティティのようなNhibernateで選択してください。 これは、クエリ範囲から参照されるタイプの変数ですが、定義されていません

var modelDetailEngine = session.QueryOver<CarSpecification>(() => specificationAlias) 
        .Left.JoinAlias(() => specificationAlias.Car,() => carAlias) 
        .Left.JoinAlias(() => carAlias.Year,() => yearAlias) 
        .Left.JoinAlias(() => yearAlias.Model,() => modelAlias) 
        .Left.JoinAlias(() => modelAlias.Style,() => styleAlias) 
        .Left.JoinAlias(() => styleAlias.Manufacturer,() => manufactureAlias) 
        .Where(() => manufactureAlias.Id == manufactureId && modelAlias.Id == modelId && yearAlias.Id == yearId) 
        .Select(p => new ModelDetailEngineDto() 
        { 
         EngineName = p.Engine, 
         EngineType = p.Type_Engine, 
         CompressionRatio = p.Compresstion, 
         DrivingType = p.Driving_Type, 
         TranmissionType = p.Transmission_Type, 
         FuelType = p.Fuel_Type, 
         FuelEconomyCity = p.Fuel_Economy_City, 
         FuelEconomyHighway = p.Fuel_Economy_Highway, 
         Locking = p.Locking, 
         EngineValvetrain = p.Engine_Valvetrain, 
         ESS = p.ESS, 
         EBD = p.EBD, 
         RemoteVehicle = p.Remote_Vehice, 
         Tranmission = p.Transmission, 
         ExteriorLength = p.Exterior_Length, 
         ExteriorWidth = p.Exterior_Width, 
         ExteriorHeight = p.Exterior_Height, 
         HorsePower = p.Horsepower, 
         Torque = p.Torque, 
         DragCoeficient = p.Drag_Coeficient, 
         TimeSpeed = p.TimeSpeed, 
         Km = p.Km, 
         CurbWeight = p.Curb_Weight, 
         GVWR = p.GVWR 
        }).SingleOrDefault<ModelDetailEngineDto>(); 

エラースコープから参照タイプの変数「P」であるが、それは

が定義されていない、私は私を助けてit.pleaseと間違って理解していません!

答えて

3

の構文を使用してと投影することはできません。 はLinqプロバイダではなく、独自のセマンティクスを持つ別個のAPIです。スタックオーバーフローに関する多数の回答(例ではhere)のように、QueryOver syntaxを使用する必要があります。簡潔に言えば、のラムダは、ラムダ当たり1つのエンティティプロパティを識別するために最も多く使用されます。 (Whereの条件はもう少し汎用性がありますが、simple expressionsのみです).Lambdaは、Linqのように単一のラムダで精巧な投影を表現するために使用され、サポートされていません。使用するプロパティーと同じ数のラムダで分解する必要があります。その後、結果トランスフォーマでDTOに変換します。

またはその代わりに、使用:

using System.Linq; 
using NHibernate.Linq; 

// ... 

var modelDetailEngine = session.Query<CarSpecification>() 
    .Where(cs => ...) 
    .Select(cs => new ModelDetailEngineDto 
    { 
     // ... 
    }) 
    .SingleOrDefault();