2012-04-02 69 views
1

我有麻烦混合使用C#的功能与LINQ到SQL混合使用C#功能

假设我有一个数据库表中的“东西”的条件和本地C#功能:BOOL isGood( 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:方法'布尔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 over mythings而不是调用toList(),也可以。虽然似乎不雅。

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

编辑:

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

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

isGood()函数是一个可以包含的简单函数吗?如果它可以表示为Linq,那将是最简单的解决方案。 – 2012-04-02 13:54:10

+0

它相当复杂。除此之外,它检查item1是否适合放在另一个表的任何item2中,允许旋转 – HugoRune 2012-04-02 13:57:10

+0

是的,这么认为。那么我认为没有任何选择。把整个名单拉回来。找到主键,然后在完成提交时进行删除。我很想知道是否有其他人可以想办法解决这个问题,所以我很喜欢它,看看有没有人能想出办法。 – 2012-04-02 14:02:55

回答

2

拉动整个列表从数据库恢复到运行本地的C#功能上它似乎效率不高,但你必须做什么,如果你isGood()函数是本地的。

如果你可以转换isGood()函数为LINQ的,你可以在toList()调用之前使用它,所以它会得到翻译成SQL和整个列表将不会被检索。