我需要将此SQL语句移植到LINQ:
SELECT f.ID as IdFlight,
Tarif * 1 as Tarif,
f.Time, f.TimeOfArrival,
sl.Name as FromLoc,
sl.Country as FromCountry,
sl.Airport as FromAirport,
dl.Name as ToLoc,
dl.Country as ToCountry,
dl.Airport as ToAirport
FROM Flights as f
INNER JOIN Locations as sl ON sl.ID = f.ID_Source
INNER JOIN Locations as dl ON dl.ID = f.ID_Destination
INNER JOIN FlightsTarifs as ftf ON f.Id = ftf.IDFlight
WHERE f.ID_Destination =30005 AND f.Time <= DATEADD(day,4,'2018/05/24 00:00')
AND f.Time >= '2018/05/24 00:00' ORDER By f.Time, Tarif
我在Linq的尝试:
IQueryable qinfo = from f in context.Flights
join sl in context.Locations on f.Id_Source equals sl.ID
join dl in context.Locations on f.Id_Destination equals dl.ID
join ftf in context.FlightsTarifs on f.ID equals ftf.IDFlight
where (f.Id_Source == aFormUser.FlightSrcID)
where (f.Id_Destination == aFormUser.FlightDestID)
where (f.Time.Date >= aFormUser.DepartureDate.Date)
where (f.Time.Date <= aFormUser.DepartureDate.Date.AddDays(4))
orderby f.Time, ftf.Tarif
select new {f.ID, ftf.Tarif, f.Time, f.TimeOfArrival,
sl.Name, sl.Country, sl.Airport,
dl.Name, dl.Country, dl.Airport };
我现在有一些问题需要解决:
答案 0 :(得分:3)
您可以将带有new
对象初始化程序的别名与下面的代码一起使用,这也将支持乘以tarif:
select new {
f.ID,
Tarif = ftf.Tarif * 1, // Alias and multiply by your number
f.Time,
f.TimeOfArrival,
SourceName = sl.Name, // Alias
SourceCountry = sl.Country, // Alias
SourceAirport = sl.Airport, // Alias
DestName = dl.Name, // Alias
DestCountry = dl.Country, // Alias
DestAirport = dl.Airport // Alias
};
只是为了提供更多细节,以防其他人偶然发现,其根本原因是代码使用new
关键字来定义一个匿名类型,其中包含一个对象初始化程序,该对象初始化程序遇到多个冲突,试图定义匿名类(具有相同推断名称的多个属性,然后在tarif乘以时无法从表达式中命名属性)。
通过显式命名具有冲突的属性,编译器不再需要推断产生冲突的命名。
上面的链接提供了一些关于如何将对象初始化程序与匿名类型一起使用的其他示例。
答案 1 :(得分:1)
此概念称为 Projection ,您必须根据需要选择新的匿名类型或别名。
<强>示例:强>
var result = data.Select( x => new { FieldName = x.Property } );