我需要将此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 };
我现在有一些问题要解决:
1.由于我将表flights与表locations连接了两次,以便获得源位置和目的地位置的名称,因此在LinQ中这样做会导致编译器错误,即dl.Name、dl.Country、dl、Airport是匿名类型,它们最终将与其他sl.Name、sl.Country、sl. Airport具有相同的名称。
1.我不能像在Sql中那样使用“As”表达式,或者在Linq中是否有等效的表达式?
1.当我在linq查询中时,我不能将Tarif乘以乘客数量,因为它不允许我这样做。
2条答案
按热度按时间h7appiyu1#
您可以通过下面的代码在
new
对象初始化器中使用别名,它也支持乘以tarif:为了防止其他人偶然发现这个问题,我们提供一些更多的细节,根本原因是代码使用
new
关键字来定义匿名类型,对象初始化器在尝试定义匿名类时遇到了多个冲突(多个属性具有相同的推断名称,然后当tarif相乘时无法从表达式命名属性)。通过显式命名有冲突的属性,编译器不再需要推断产生冲突的命名。
更多信息:http://geekswithblogs.net/BlackRabbitCoder/archive/2012/06/21/c.net-little-wonders-the-joy-of-anonymous-types.aspx
上面的链接有一些关于如何使用匿名类型的对象初始化器的附加示例。
qfe3c7zg2#
这个概念被称为投影,您必须根据您的要求选择新的匿名类型或别名。
样品: