当前位置: 首页 > 编程语言 > C#

String.StartsWith不使用波浪号(“~”)字符LINQtoSQL?

时间:2023-04-11 10:30:35 C#

String.StartsWith不使用波浪号(“~”)字符LINQtoSQL?出于某种原因,我使用String.StartsWith()调用IEnumerable.Where()似乎会给出不同的结果,具体取决于它是在LINQ-to-SQL还是标准LINQ(-to-objects)中使用。如果我在ToList()上添加对同一调用的调用,我会得到不同的结果:varwithToList=MyDataContext.MyEntities.ToList().Where(entity=>entity.Name.StartsWith("~Test:MyTestString"));//withToList.Count()返回5,这是我所期望的。vardirect=MyDataContext.MyEntities.Where(entity=>entity.Name.StartsWith("~Test:MyTestString"));//direct.Count()返回0我的理解是,与LINQ中的一些其他运算符/方法不同,Where()方法不要求谓词是SQL可翻译的;它在客户端执行,因此可以是任意的.NET代码。(我肯定会在其中放入其他非SQL代码并获得成功结果)。我什至得到了一个链接,其中安德斯本人建议这应该有效。有错误吗?编辑:我发现了问题;它与我的搜索字符串中波浪号的存在有关。我更新了标题以反映这一点。此查询将在SQL中执行-因此根据SQL处理“LIKE”的方式,您可能会看到一些奇怪的东西。我建议您找出它正在运行的查询并尝试在SQLManagementStudio中自己运行它。在这种情况下,它似乎并不常见——它可能是LINQtoSQL中的一个错误;它可能无法正确转义。(这是否意味着SQLLIKE子句中有任何特殊之处?)任何想要在数据库端执行的东西都需要经过SQL翻译。它不能包含任意.NET代码-只有LINQ-to-SQL能够转换的代码。否则,组合就会被破坏——如果你在之后添加一个连接或排序等,在SQL中进行一些处理,并在客户端混合两者进行一些处理变得非常困难。您可以在SQL中执行一些操作,在客户端执行一些操作。请注意,您可以使用AsEnumerable作为ToList的替代方法,让查询的其余部分在进程中执行。按照Konamiman的建议,我检查了日志以查看正在执行的SQL。这是我得到的(一个广泛的例子)。第一个调用执行:SELECT[t0].[ID],[t0].[Name]FROM[dbo].[MyEntity]AS[t0]这是有意义的,因为过滤发生在客户端,所以我们需要查询所有行.第二个调用执行:SELECTCOUNT(*)AS[value]FROM[dbo].[MyEntity]AS[t0]WHERE[t0].[Name]LIKE@p0ESCAPE'~'所以,JonSkeet在正确的轨道上走上正轨;我遇到问题是因为我的数据/查询条件中碰巧有波浪号。这会导致LINQ-to-SQL将其标记为转义字符,因此不会在搜索中使用它。这个MSDN线程很好地解释了原因;它似乎是LINQ-to-SQL代码中的错误。建议的解决方法是使用LINQ的SQLMethods.Like()方法将转义字符从“~”更改为如下内容:vardirect=MyDataContext.MyEntities.Where(entity=>SQLMethods.Like(entity.Name,"~Test:MyTestString%","!");//direct.Count()现在按预期返回5这有效,但不幸的是,它只是一个LINQ-to-SQL解决方案。如果您在LINQ-to-Object版本上尝试它,您将收到以下错误:它仅用于翻译成SQL。当JonSkeet建议使用AsEnumerable()时,也会发生同样的事情。我已经尝试将我的StartsWith调用包装在一个方法中并使用带有StringComparisonOption的StartsWith,但是这些在LINQ-to-SQL端不起作用,因为它们不是SQL可翻译的。(因此我之前关于Where()方法的假设是不正确的)。所以:看起来(直到这个错误被修复)你不能有一个既使用波浪符号又与LINQ的基本风格无关的搜索功能。(如果有办法,一定要贴出来)。在第一种情况下,Where谓词实际上不需要转换为SQL,因为您首先将整个表转换为内存(ToList),然后进行过滤。在第二种情况下,Where谓词需要转换为SQLWHERE子句,因为过滤是在数据库中完成的。String.StartsWith方法被翻译成SQLLIKE语句。请记住,您可以使用DataContext.Log属性查看生成的SQL。这应该可以帮助您了解它是如何工作的。以上就是C#学习教程:String.StartsWith不使用波浪号(“~”)字符LINQtoSQL?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: