我们有一些使用
Linq to sql作为ORM的遗留代码.我们想将这个逻辑迁移到.Net Core,以便我们可以将它放在
Linux服务器上.据我所知,L2S不包含在.Net Core中.
阻力最小的迁移路径是什么?
解决方法
如果您使用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一起使用,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首先不会翘起来.但至少有一个简单的通用解决方案.