Linq:方法不支持转换为SQL,但是如何转储到内存

本文关键字:何转储 转储 内存 不支持 方法 转换 SQL Linq | 更新日期: 2023-09-27 18:00:02

我有一个从SQL表中读取的Linq查询,它返回的1个字段来自自定义函数(在C#中)。

类似于:

var q = from my in MyTable
        select new
        {
           ID = my.ID,
           Amount = GetAmount(ID)
        };

如果我在LinqPad中执行q.Dump(),它将显示结果,这告诉我它运行自定义函数而不尝试将其发送到SQL。

现在我想将其合并到另一个查询中,使用:

var q1 = (from p in AnotherQuery.Union(q)...

并且我得到了CCD_ 2。

所以,我的逻辑告诉我,我需要在内存中转储q,然后尝试与之结合。我已经尝试过用ToList()来做这件事,并创建了一个从List中填充自身的辅助查询,但这会导致一长串不同的错误。我是在正确的轨道上,通过努力让q在记忆中和联盟中,还是有更好的方法来做到这一点?

Linq:方法不支持转换为SQL,但是如何转储到内存

在被翻译的LINQ查询中不能使用任何自定义函数,只能使用给定LINQ提供程序支持的函数。如果您希望查询发生在服务器上,您需要坚持使用支持的函数(即使有时这意味着必须内联原本可以重用的代码)。

两个查询之间的差异可以归结为投影发生的时间(和地点)。在第一种情况下,来自MyTable的数据是从DB返回的——在您的示例中,只有ID。然后,投影发生在这个之上——在应用程序中为每个ID调用GetAmount方法。

另一方面,在第二个查询中不可能发生这种情况,因为在最终投影中没有使用GetAmount

您要么需要用提供者理解的内联查询替换自定义函数,要么重构所有查询以使用支持的函数以及您需要在内存中执行的任何操作。给您任何示例代码都没有意义,因为它完全取决于您的实际查询,以及您真正想要查询的内容。