使用VB.net,以下代码段会给出以下错误。
Dim _account = Account.Find(Function(x As Account) x.AccountName = txtFilterAccountName.Text)
或类似的,如果我做
.SingleOrDefault (Function(x As Account) x.AccountName = txtFilterAccountName.Text)
都会给出错误“不支持方法'CompareString'”。如果我进行相同的调用搜索整数(ID字段),它工作正常。
.SingleOrDefault (Function(x As Account) x.Id = 12)
所以整数匹配很好但字符串不起作用这是VB.net模板的问题吗?
答案 0 :(得分:1)
这不是Vb.Net模板的问题。
问题是您没有使用普通的LINQ提供程序。基于你的标签(亚音速),我猜你正在使用LINQ to SQL查询。
问题在于,我们试图将您的代码转换为表达式树,然后将其转换为类似SQL的查询。您的项目设置正在将您的字符串比较转换为VB运行时中的调用。具体来说,Microsoft.VisualBasic.CompilerServices.Operators.CompareString。
有问题的LINQ2SQL生成器或VB编译器(不记得在我的脑海中完成此检查的地方)并不了解如何将其转换为等效的SQL。因此它会产生错误。您需要使用LINQ2SQL支持的字符串比较函数。
编辑更新
看起来Linq2SQL案例中应该支持CompareString运算符。亚音速是否有不同的提供者不支持这种翻译?
答案 1 :(得分:1)
问题在于SubSonic3的SQL生成器和从VB.NET生成的表达式树。
VB.NET生成一个不同的表达式树,如JaredPar所述,而SubSonic3没有考虑它 - 请参阅Issue 66。
我已将修复程序实现为described,但它尚未合并到SubSonic3的主分支中。
答案 2 :(得分:0)
BlackMael的修复已经提交:
http://github.com/subsonic/SubSonic-3.0/commit/d25c8a730a9971656e6d3c3d17ce9ca393655f50
解决方案解决了我的问题,类似于John Granade的问题。
感谢所有参与者。