我在将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,整个列表就不会被检索到。