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

Hom*_*sey 17 linq-to-sql .net-core asp.net-core

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

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

Pet*_*one 9

如果您使用L2S,因为EF在使用Skip和Take取得大块结果作为块时效率很低,那么最好的选择是Dapper.获取LINQPad的副本并使用它来获取每个LINQ表达式的生成的SQL.

L2S围绕实际查询包含一些奇怪的SQL,以使用SQL的rownumber函数来实现skip和take.如果您使用的是最新版本的SQL Server,则不需要这样,因为TSQL现在具有相当于skip和take的子句.如果您直接编写SQL并生成可理解的SQL,这将不会在后面的人中引发WTF,这很方便,但LINQ方式适用于所有版本的SQL Server.

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

如果你想要所有的智能来构建具有由集合成员资格隐含的FK值的对象图,那么你运气不好,你将不得不手动编码.

更新2018-05-11

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

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

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

你不应该这样做; L2S首先不会翘起来.但至少有一个直截了当的通用解决方案.

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

  • @Simon_Weaver我记得那些快乐的日子.我们已经完全循环:数据库越搞砸,EF就越无用.任何实际使用的公司数据库都是_always_猪的早餐.小巧玲珑成为唯一的实用选择. (5认同)
  • 哈我使用linq2sql因为EF不存在! (3认同)
  • @PeterWone L2S 已经有十多年没有改进了,但它仍然更快,并且具有 EF Classic 和最新 EF Core 没有结合的功能 (v3.1)。即支持同时插入/更新存储过程和批量更新。EF Classic 有存储过程,但没有批处理。EF Core 有批处理,但没有写入存储过程。此外,它的性能始终比 EF Classic 高得多。关于外连接,L2S DataContext 有“LoadOptions”,您可以在其中配置“LoadWith<InnerTable>(inner => inside.OutetTable)”来一次获取所有数据。 (3认同)