【发布时间】:2012-04-02 21:50:50
【问题描述】:
我在将 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
我可以对神话做一个 foreach 而不是调用 toList(),这也有效。不过看起来很不雅。
我还有哪些其他选择,这里推荐的方法是什么?
编辑:
调用 asEnumerable() 似乎是另一种选择,至少似乎比 toList() 更好。即
dataContext.Things.Where(t=>t.type=mytype).asEnumerable().Any(t=>isGood(t,myparams))
【问题讨论】:
-
isGood() 函数是一个可以包含的简单函数吗?如果它可以表示为 Linq,那将是迄今为止最简单的解决方案。
-
相当复杂。除其他外,它检查 item1 是否适合另一个表中的任何 item2,并允许旋转
-
是的,我是这么想的。我认为那时没有任何选择。必须把整个名单拉回来。找到主键,然后在提交时将它们全部删除。我很想知道是否有其他人能想出解决方法,所以我会收藏它,看看是否有人能想出解决方法。
标签: c# linq linq-to-sql c#-4.0 notsupportedexception