1

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

假设我有一个数据库表“事物”和一个本地 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

我可以对神话做一个 foreach 而不是调用 toList(),这也有效。虽然看起来不优雅。

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

编辑:

调用 asEnumerable() 似乎是另一种选择,并且至少比 toList() 更好。IE

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

1 回答 1

2

从数据库中拉回整个列表以在其上运行本地 c# 函数可能看起来效率低下,但如果您的 isGood() 函数是本地的,那么您必须这样做。

如果您可以将 isGood() 函数转换为 Linq,则可以在 toList() 调用之前应用它,这样它就会被转换为 SQL,并且不会检索到整个列表。

于 2012-04-02T13:42:06.373 回答