String.StartsWith不使用波形符("〜")字符LINQ to SQL?

Cra*_*ker 4 .net c# linq linq-to-objects linq-to-sql

出于某种原因,我使用String.StartsWith()调用IEnumerable.Where()似乎会给出不同的结果,具体取决于它是在LINQ-to-SQL还是标准LINQ(-to-objects)中使用.如果我在ToList()上添加对同一个调用的调用,我会得到不同的结果:

var withToList = MyDataContext.MyEntities.ToList().Where(entity => entity.Name.StartsWith("~Test: My Test String"));
// withToList.Count() returns 5, which is what I expect.
var direct = MyDataContext.MyEntities.Where(entity => entity.Name.StartsWith("~Test: My Test String"));
// direct.Count() returns 0
Run Code Online (Sandbox Code Playgroud)

这是我的理解是,不像一些在LINQ其他运营商/方法中,其中()方法并没有要求谓语是SQL翻译的; 它在客户端执行,因此可以是任意.NET代码.(我肯定会在其中抛出其他非SQL代码并获得成功结果).我甚至得到了一个链接,其中安德斯自己暗示这应该有效.有没有搞错?

编辑:我发现了问题; 它与我的搜索字符串中存在波浪号有关.我已更新标题以反映这一点.

Jon*_*eet 5

此查询在SQL中执行 - 因此您可能会看到一些奇怪的内容,具体取决于SQL如何处理"LIKE".我建议你找出它正在运行的查询,并尝试在SQL Management Studio中自己运行它.在这种情况下,它似乎并不常见 - 它可能是LINQ to SQL中的一个错误; 它可能无法正常逃避.(是否表示SQL LIKE子句中的任何特殊内容?)

任何想要成为数据库端执行内容的东西需要进行SQL翻译.它不能包含任意.NET代码 - 只有LINQ-to-SQL能够翻译的代码.否则组合会被破坏 - 如果你之后添加一个连接或一个排序等,那么在SQL中进行一些处理会变得非常困难,而在客户端进行一些处理会混合两者.你可以在SQL中做一些,然后在客户端做一些.请注意,您可以使用它AsEnumerable作为替代方法,ToList以使其余查询在进程中执行.