我是nhibernate的新手,我尝试像实体一样在Nhibernate中使用Select。这是查询
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>();
Run Code Online (Sandbox Code Playgroud)
从作用域引用的类型的错误变量“ p”,但未定义
我不明白它有什么问题。请帮助我!
您无法使用linq-to-hhibernate语法来进行queryover投影。queryover不是Linq提供程序,而是具有自己语义的独特API。您必须使用QueryOver语法,如有关Stack Overflow的许多答案所示(此处为示例)。
简而言之,queryover中的lambda 通常用于识别每个lambda仅一个实体属性。(除了Where条件更通用之外,其他条件仅适用于简单表达式。)与Linq一样,不使用Lambda并支持在单个Lambda中表达复杂的投影。您必须使用与所用属性一样多的lambda分解它。然后使用结果转换器将其转换为DTO。
或者,使用linq-to-hhibernate:
using System.Linq;
using NHibernate.Linq;
// ...
var modelDetailEngine = session.Query<CarSpecification>()
.Where(cs => ...)
.Select(cs => new ModelDetailEngineDto
{
// ...
})
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2160 次 |
| 最近记录: |