2017-03-18 9 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'이지만,

을 정의되지 않은 내가 도와 목소리로 듣기에는 좋은 사람 같던데 잘못 이해하지 않는다!

답변

3

구문을 사용하여 으로 투영 할 수 없습니다. 은 Linq 공급자가 아니며 고유 한 의미 체계가있는 고유 한 API입니다. 스택 오버플로에 대한 많은 답변 (예제에서는 here)과 같이 QueryOver syntax을 사용해야합니다.

즉, 의 λ는 주로 λ 당 하나의 엔티티 특성을 식별하는 데 사용됩니다. (Where 조건은 조금 더 다양하지만 조건은 simple expressions입니다.) 람다는 Linq처럼 단일 람다에서 정교한 투영을 표현하기 위해 사용되거나 지원되지 않습니다. 사용 된 속성만큼의 람다로 분해해야합니다. 그런 다음 결과 변환기를 사용하여이를 DTO로 변환하십시오.

또는 대신, 사용

using System.Linq; 
using NHibernate.Linq; 

// ... 

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