将 Linq to SQL 代码迁移到 .Net Core

Migrating Linq to SQL code to .Net Core

我们有一些遗留代码使用 Linq to SQL 作为 ORM。我们想将此逻辑迁移到 .Net Core,以便我们可以将其放置在 linux 服务器上。据我所知,.Net Core 中不包含 L2S。

阻力最小的迁移路径是什么?

如果您要将遗留代码重写为 .NET Core,这将需要一些努力。

对于 L2S,您可能需要使用 Entity Framework Core 将其重写为现代查询。不过,它可能会让您的生活更轻松地从数据库生成实体,请参阅 Reverse engineer your model

这是推荐的方法,但我不确定这是否是您的情况中最简单的方法。

如果您使用 L2S 因为 EF 在使用 Skip 和 Take 将大结果作为块获取时效率低下,那么您最好的选择是 Dapper. Get yourself a copy of LINQPad 并使用它为每个块生成 SQL你的 LINQ 表达式。

L2S 在实际查询周围包装了一些奇怪的 SQL 以使用 SQL 的行号函数来实现跳过和获取。如果您使用的是最新版本的 SQL 服务器,那么您不需要这个,因为 TSQL 现在有等同于 skip and take 的子句。如果您直接编写 SQL 并生成可理解的 SQL 不会在跟随者中引起 WTF,那么这很方便,但 LINQ 方式适用于所有版本的 SQL 服务器。

然后将此 SQL 与 Dapper 一起使用,它将为您完成 ORM 部分。它还对类似于 L2S 的类型映射参数提供了适当的支持,因此您可以避免构建 SQL 字符串和注入漏洞。

如果您想要使用集合成员资格隐含的 FK 值构建对象图的所有智能,那么您就不走运了,您将不得不手动编写代码。

2018-05-11更新

EF 没有以前那么可怕了。 EF Core 比 EF 更简单,同时保留了许多优点。我目前正在工作中的一个项目中使用 EF Core,这不是 EF 曾经的灾难。

我确实需要帮助进行外部连接。留给它自己的设备,LINQ 获取内部部分,然后为每个内部行 运行 单独查询其外部部分。

我通过 显式 获取内部部分并将键集构造为 int 数组来修复此问题。另一个 LINQ 语句利用 Array.Contains 映射到使用索引的 IN 这一事实获取了 all 外部行。然后我使用 ToArray() 实现了这两个部分,并使用 LINQ 将它们连接到内存中。这使执行时间从十分钟减少到 300 毫秒。

你不应该这样做; L2S 一开始就不会把它竖起来。但至少有一个简单的通用解决方案。

我的解决方案的一个缺点是它不能很好地适应渐进式获取。

2020-06-12更新

Dapper 可以 return 动态结果。我发现这是 SQL 和 C# 之间的一个很好的桥梁。列及其名称由 SQL 控制。这可能有点脆弱,因为 C# 区分大小写而 SQL 不区分大小写,但是使用代码中的 SQL 您至少可以看到它是什么并修复它。

更重要的是,您可以直接对这些动态结果使用 LINQ。

截至 2017 年 5 月,DevArt 的 LinqConnect 现在支持 .NET Core:

https://www.devart.com/news/2017/net-core-support.html

它是 Linq To Sql 的替代品,如果您愿意,它甚至可以让您脱离 MS SQL 服务器!