2017-03-18 82 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。您必須使用QueryOver syntax,如Stack Overflow的許多答案中所示(例如,here)。

總之,中的lambda主要用於識別每個lambda只有一個實體屬性。 (除了Where條件更加通用,但僅適用於simple expressions。)與Linq一樣,Lambda不能用於在單個lambda表達精細投影,也不支持。您必須按照所用屬性的lambda分解它。然後用結果轉換器將其轉換爲DTO。

或替代,使用

using System.Linq; 
using NHibernate.Linq; 

// ... 

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