Linq to sql 将Linq到SQL代码迁移到.Net核心

Linq to sql 将Linq到SQL代码迁移到.Net核心,linq-to-sql,asp.net-core,.net-core,Linq To Sql,Asp.net Core,.net Core,我们有一些使用LINQtoSQL作为ORM的遗留代码。我们希望将此逻辑迁移到.NETCore,以便将其放在linux服务器上。据我所知,L2S不包括在.Net内核中 什么是阻力最小的迁移路径?如果要将遗留代码重写到.NET Core,这将需要一些努力 对于L2S,您可能需要使用实体框架核心将其重写为现代查询。不过,这可能会使您的生活更容易从数据库生成实体,请参阅 这将是推荐的方法,但我不确定这是否是您的情况下最简单的方法。如果您使用L2S,因为EF在使用Skip and Take作为块获取大型结

我们有一些使用LINQtoSQL作为ORM的遗留代码。我们希望将此逻辑迁移到.NETCore,以便将其放在linux服务器上。据我所知,L2S不包括在.Net内核中


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

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

对于L2S,您可能需要使用实体框架核心将其重写为现代查询。不过,这可能会使您的生活更容易从数据库生成实体,请参阅


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

如果您使用L2S,因为EF在使用Skip and Take作为块获取大型结果时效率低下,那么您的最佳选择是。获取的副本,并使用它为每个LINQ表达式获取生成的SQL

L2S在实际查询中封装了一些奇怪的SQL,以使用SQL的rownumber函数实现skip和take。如果您使用的是最新版本的SQL Server,那么您就不需要它,因为TSQL现在有相当于skip和take的子句。如果您直接编写SQL,并生成可理解的SQL,而这些SQL不会在后续人员中引发WTF,但LINQ方法适用于所有版本的SQL Server,那么这将非常方便

然后将此SQL与Dapper结合使用,这将为您完成ORM部分。它还适当支持与L2S类似的类型映射参数,因此可以避免生成SQL字符串和注入漏洞

如果你想用集合成员身份所隐含的FK值来构造对象图,那么你就不走运了,你必须手工编写代码

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

我确实需要帮忙做一个外部连接。让LINQ自己使用自己的设备,LINQ获取内部部分,然后为每个内部行的外部部分运行单独的查询

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

你不应该这样做;L2S一开始就不会把事情搞砸。但至少有一个简单的通用解决方案

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

更新2020-06-12 Dapper可以返回动态结果。我发现这是SQL和C#之间的一座很好的桥梁。列及其名称由SQL语句管理。这可能有点脆弱,因为C#区分大小写,SQL不区分大小写,但使用代码中的SQL,您至少可以看到并修复它


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

DevArt的LinqConnect从2017年5月起现在支持.NET Core:


它是Linq To Sql的替代品,如果您愿意,它甚至会使您脱离MS Sql Server

哈,我使用linq2sql是因为EF不存在@西蒙·韦弗我记得那些快乐的日子。我们已经走了一个完整的循环:数据库越糟糕,EF就越无用。而任何实际使用的公司数据库都是猪的早餐。整洁成为唯一可行的选择。两年后,我们从未重构过它。然而,我们已经在未来的一些新项目中使用了Dapper,它相当不错。@PeterWone L2S十多年来一直没有改进过,但它速度更快,并且具有EF Classic和最新EF Core没有结合的功能(v3.1)。即,支持同时插入/更新存储过程和批量更新。EF Classic有存储过程,但没有批处理。EF Core有批处理,但没有写入存储过程。此外,它总是比EF Classic表现得更出色。关于外部连接,L2S DataContext有
LoadOptions
可以配置
LoadWith(inner=>inner.OutetTable)
一次获取所有数据。@我已经知道,您不需要向我介绍L2S的优点。但它在勇敢的新dotnet核心世界中不可用,仅此而已。OneCore项目将两者融合在一起,SQL团队积极地想要杀死L2,因此您可以期望L2在某个时候停止工作。标准是150美元,Pro是250美元,Express是免费的,但不支持.NET核心,并且有10个实体的限制。这是什么?每开发者许可证@EMYR这些是单一许可证价格,团队(一家公司,4个开发人员,一个物理地址)和站点(一家公司,无限开发人员,一个物理地址)的价格是按以下价格列出的:我的团队更容易花时间迁移到具有核心支持(EF、Dapper等)的更常见的ORM而不是解决这些问题,然后通过我组织的采购和财务团队解决这些问题,特别是因为我的同事可能在其他城市或国家工作。@Emyr您能轻松地从LinqToSql移植到EF吗?在这里,我们提到了以前的一种方法,即在字符串常量中格式化SQL语句。这种方法很好地映射到LinqToSql,在这里,您可以使用LinqQueries使期望的SQL能够像这样工作吗?我们前进的主要目标是在客户站点和办公室中锁定数据库模式,我们不再需要支持启动和配置人员对数据库模式进行本地更改,特别是因为这些更改很少有文档记录,也从未发送回开发,所以我们的模式是最新的。