将指定SQL语句转换为LINQ时遇到三类问题求助
解决LINQ转换SQL时的三个常见问题
嘿,我帮你梳理下这三个LINQ转换时遇到的问题,逐个给你解决:
问题1:匿名类型字段重名导致编译错误
你遇到的编译错误是因为sl.Name和dl.Name在匿名类型里都默认叫Name,而匿名类型不允许存在同名的属性。解决方法很简单——给这些重名字段手动指定别名,就像你在SQL里用AS那样:
// 示例:给出发地和目的地的字段分别命名 FromLoc = sl.Name, FromCountry = sl.Country, FromAirport = sl.Airport, ToLoc = dl.Name, ToCountry = dl.Country, ToAirport = dl.Airport
这样就不会有重名冲突了,同时也能清晰区分出发地和目的地的信息。
问题2:LINQ中SQL AS的等价用法
其实你刚才解决重名的方式,就是LINQ对应SQL AS的用法!在LINQ的匿名类型(或者强类型对象)中,通过别名 = 字段/表达式的语法,就完全等价于SQL里的字段 AS 别名。
比如你原SQL里的f.ID as IdFlight,在LINQ里直接写:
IdFlight = f.ID
就实现了同样的别名效果。如果是映射到自定义的实体类,那类的属性名本身就相当于AS的别名,不需要额外操作。
问题3:在LINQ中对Tarif乘以乘客数量
这个需求实现起来很直接——在select子句里直接进行计算就行。LINQ会自动把这个计算转换成对应的SQL表达式(比如Tarif * @PassengerCount),不需要额外的复杂操作。
假设你的乘客数量存储在aFormUser.PassengerCount里,那可以这么写:
Tarif = ftf.Tarif * aFormUser.PassengerCount
完整修改后的LINQ代码
// 先提取乘客数量变量(可选,让代码更清晰) int passengerCount = aFormUser.PassengerCount; 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条件合并成一个,用&&连接,代码更简洁 where f.Id_Destination == aFormUser.FlightDestID && f.Time.Date >= aFormUser.DepartureDate.Date && f.Time.Date <= aFormUser.DepartureDate.Date.AddDays(4) // 如果你需要保留原LINQ里的出发地筛选条件,就加上下面这行 // && f.Id_Source == aFormUser.FlightSrcID orderby f.Time, ftf.Tarif select new { IdFlight = f.ID, // 对应SQL的IdFlight别名 Tarif = ftf.Tarif * passengerCount, // 乘以乘客数量 f.Time, f.TimeOfArrival, FromLoc = sl.Name, FromCountry = sl.Country, FromAirport = sl.Airport, ToLoc = dl.Name, ToCountry = dl.Country, ToAirport = dl.Airport };
补充说明:
- 原SQL里没有
f.Id_Source == aFormUser.FlightSrcID这个条件,如果你是业务需要添加的,记得保留;如果是误加,可以去掉。 - 多个where条件合并成一个用
&&连接,和分开写多个where的效果完全一样,但代码可读性更好。
内容的提问来源于stack exchange,提问作者user1238784
相关产品推荐
相关产品推荐

