将c函数与Linq-To SQL条件混合使用



我在将c#函数与Linq To SQL 中的条件混合时遇到问题

假设我有一个数据库表"things"和一个本地c#函数:bool isGood(thing,params)

我想使用该函数从表中选择行。

var bad = dataContext.Things.Where(t=>t.type=mytype && !isGood(t,myparams))
dataContect.Things.deleteAllOnSubmit(bad);

if (dataContext.Things.Any(t=>t.type=mytype && isGood(t,myparams)))
{
    return false;
}

当然,这是行不通的,Linq没有办法将我的函数转换成SQL语句。因此,这将产生:

NotSupportedException:方法"Boolean isGood(thing,params)"不支持转换为SQL。

重新设计它以使其发挥作用的最佳方法是什么?

我可以拆分语句并转换为如下列表:

List<Things> mythings dataContext.Things.Where(t=>t.type=mytype).toList()
if (mythings.Any(t=>isGood(t,myparams)))
{
    return false;
}

这是有效的,但似乎效率很低,因为在任何情况下都必须生成整个列表。我不认为我可以用的结果进行deleteAllOnSubmit

我可以对mythings进行foreach,而不是调用toList(),这也很有效。看起来很不雅。

我还有什么其他选择,这里推荐的方法是什么?

编辑:

调用asEnumerable()似乎是另一种选择,而且似乎至少比toList()要好。即

dataContext.Things.Where(t=>t.type=mytype).asEnumerable().Any(t=>isGood(t,myparams))

从数据库中提取整个列表以在其上运行本地c#函数可能看起来效率很低,但如果您的isGood()函数是本地的,则必须执行此操作。

如果你能把isGood()函数翻译成Linq,你可以在toList()调用之前应用它,这样它就会被翻译成SQL,整个列表就不会被检索到。

最新更新