【问题标题】:VB.net can't find by stringVB.net 无法通过字符串找到
【发布时间】:2009-07-17 21:43:13
【问题描述】:

使用VB.net,下面的sn-p给出了下面的错误。

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模板的问题吗?

【问题讨论】:

    标签: vb.net subsonic


    【解决方案1】:

    不,这不是 Vb.Net 模板的问题。

    问题在于您使用的不是普通的 LINQ 提供程序。根据您的标签(亚音速),我猜您正在使用 LINQ to SQL 查询。

    问题在于,在后台,这是试图将您的代码转换为表达式树,然后将其转换为类似 SQL 的查询。您的项目设置正在将您的字符串比较转换为 VB 运行时中的调用。具体来说,Microsoft.VisualBasic.CompilerServices.Operators.CompareString。

    有问题的 LINQ2SQL 生成器或 VB 编译器(不记得这个检查是在哪里完成的)不知道如何将其转换为等效的 SQL 位。因此它会产生错误。您需要使用 LINQ2SQL 支持的字符串比较函数。

    编辑更新

    看起来在 Linq2SQL 案例中应该支持 CompareString 运算符。 subsonic 是否有其他不支持此翻译的提供商?

    【讨论】:

    • 感谢您的洞察力。我不确定 Link2SQL 生成器的详细信息。我使用 SubSonic 来避免其中的一些细节。但是随着新发布的 SubSonic 3.0 似乎 VB 家伙真的必须深入了解它,以进行必要的更改以使其正常工作。这给了我一些研究的东西,所以再次......谢谢。
    【解决方案2】:

    问题在于 SubSonic3 的 SQL 生成器和从 VB.NET 生成的表达式树。

    如 JaredPar 所述,VB.NET 生成一个不同的表达式树,而 SubSonic3 没有考虑到它 - 请参阅 Issue 66

    我已将修复作为described 实施,但尚未合并到 SubSonic3 的主分支中。

    【讨论】:

    • BlackMael,感谢您的评论和指导。您能否对您的修复提供更多见解。该文章显示了使用 BinaryExpression 的 ConvertVBStringCompare 辅助函数,但对于 SubSonic Find 或 SingleorDefault 那些采用 Expression 并且我认为不可能来回转换它们。您在问题 66 中提到您有一个修复程序。您能否将其合并到 VB.net 模板分支中,以便我们可以在他们决定如何将其合并到生产中时获得它们?谢谢。约翰
    【解决方案3】:

    BlackMael 的修复已提交:

    http://github.com/subsonic/SubSonic-3.0/commit/d25c8a730a9971656e6d3c3d17ce9ca393655f50

    修复解决了我的问题,类似于上面的 John Granade。

    感谢所有相关人员。

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多