c# - Entity Framework 和大型查询。什么实用?

标签 c# linq tsql entity-framework

我来自旧学校,在那里 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 的区别在哪里?

编辑

  • 模型描述。
  • 我有 DSPTrucksDSPDriversMBLDevices
  • 设备可以连接到 Truck 或 Driver 或两者。
  • 我还有 MBLPositions,它基本上是来自设备的 ping(时间戳和 GPS 位置)

此查询的作用 - 它一次性返回所有设备-卡车-司机信息,因此我知道该设备连接到什么,它还获取我这些设备的最后一个 GPS 位置。响应可能如下所示:

enter image description here

有一些多余的东西,但没关系。我需要在一个查询中获取它。

最佳答案

一般来说,对于大多数简单查询,我也会默认使用 LINQ。

但是,当您到达相应的 LINQ 查询变得更难编写和维护的地步时,那真正的意义何在?所以我会简单地保留该查询。毕竟它有效。为了更易于使用,在 EF 模型中映射 View 或存储过程非常简单。咳嗽。这没什么不对,真的(IMO)。

关于c# - Entity Framework 和大型查询。什么实用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8610716/

相关文章:

c# - 在 EF 查询中添加 DateTime 和 TimeSpan 的代码示例

c# - 如果我使用 datacontact 在 wcf 中序列化一个对象,如何摆脱默认的 xml 命名空间

sql - 如何查找连续缺勤超过10天的员工?

c# - Linq to entities - 两个键之间字符串的第一个字母

c# - 将 CollectionBase 转换为 List 或可与 Linq 一起使用的数据类型

sql - 根据动态列查找匹配记录

sql-server - 在函数中使用 CTE 在 SQL Server 上的工作日

c# - 具有多个资源的 "using"会导致资源泄漏吗?

c# - URL 路由需要/Home/Page?page=1 而不是/Home/Page/1

c# - 我可以引用当前 Select 对象中的属性吗?