我来自旧学校,在那里 DB 将所有数据访问封装到 View 、过程等中。现在我强制自己使用 LINQ 来处理大多数明显的查询。
但我想知道的是,什么时候停止以及什么是实用的?今天我需要像这样运行查询:
SELECT D.DeviceKey, D.DeviceId, DR.DriverId, TR.TruckId, LP.Description
FROM dbo.MBLDevice D
LEFT OUTER JOIN dbo.DSPDriver DR ON D.DeviceKey = DR.DeviceKey
LEFT OUTER JOIN dbo.DSPTruck TR ON D.DeviceKey = TR.DeviceKey
LEFT OUTER JOIN
(
SELECT LastPositions.DeviceKey, P.Description, P.Latitude, P.Longitude, P.Speed, P.DeviceTime
FROM dbo.MBLPosition P
INNER JOIN
(
SELECT D.DeviceKey, MAX(P.PositionKey) LastPositionKey
FROM dbo.MBLPosition P
INNER JOIN dbo.MBLDevice D ON P.DeviceKey = D.DeviceKey
GROUP BY D.DeviceKey
) LastPositions ON P.PositionKey = LastPositions.LastPositionKey
) LP ON D.DeviceKey = LP.DeviceKey
WHERE D.IsActive = 1
就我个人而言,我无法编写相应的 LINQ。所以,我在网上找到了工具,得到了 2 页长的 LINQ。它工作正常——我可以在探查器中看到它,但它不是可维护的 IMO。另一个问题是我正在进行投影并取回匿名对象。或者,我可以手动创建类并项目到该自定义类中。
此时我想知道在SQL Server 上创建View 并将其添加到我的模型中是否更好?它会打破我的“所有 SQL 都在客户端”的口头禅,但会更容易阅读和维护。没有?
我想知道您对 T-SQL 与 LINQ 的区别在哪里?
编辑
- 模型描述。
- 我有
DSPTrucks
、DSPDrivers
和MBLDevices
。 - 设备可以连接到 Truck 或 Driver 或两者。
- 我还有
MBLPositions
,它基本上是来自设备的 ping(时间戳和 GPS 位置)
此查询的作用 - 它一次性返回所有设备-卡车-司机信息,因此我知道该设备连接到什么,它还获取我这些设备的最后一个 GPS 位置。响应可能如下所示:
有一些多余的东西,但没关系。我需要在一个查询中获取它。
最佳答案
一般来说,对于大多数简单查询,我也会默认使用 LINQ。
但是,当您到达相应的 LINQ 查询变得更难编写和维护的地步时,那真正的意义何在?所以我会简单地保留该查询。毕竟它有效。为了更易于使用,在 EF 模型中映射 View 或存储过程非常简单。咳嗽。这没什么不对,真的(IMO)。
关于c# - Entity Framework 和大型查询。什么实用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8610716/