【发布时间】:2016-09-02 21:15:19
【问题描述】:
问题
当我用 Linq 写实体时
context.MyTable.Where(t => t.Name == "Test");
它转换为以下sql:
select * from MyTable where Name = 'Test'
我想在 Linq 中为实体编写一个表达式,将转换为:
select * from MyTable where Name like 'Test'
有什么方法可以实现吗?
注意-我也尝试了Equals 和CompareTo == 0,但无济于事。
背景故事
我想使用Like而不是=的原因是因为如果你使用=,字符串末尾的空格会被忽略,但如果你使用Like,它就可以工作(看到这个问题:Why the SQL Server ignore the empty space at the end automatically?,还有这个:Linq to Entity comparing strings ignores white spaces)。
编辑:为什么它不是 How to do SQL Like % in Linq? 的重复项
该问题要求类似 %,可以使用 Contains/StartsWith/EndsWith 完成,但这不是同一个问题,我想要完全平等,所以这些对我没有帮助。
这个问题的答案看起来很有希望,使用SqlMethods.Like,所以我尝试了
context.MyTable.Where(t => SqlMethods.Like(t.Name, "Test")
但我收到以下错误:
{"LINQ to Entities 无法识别方法 'Boolean Like(System.String, System.String)' 方法,并且该方法无法转换为存储表达式。"}
【问题讨论】:
-
@Reinard + @L.B,不,它不是重复的。我想做没有 % 的 Like,
Contains在这里不起作用。 -
我建议您在查询中使用
context.MyTable.Where(t => t.Name.TrimEnd() == "Test"),看看是否能达到您想要的结果。 -
@AnthonyPegram 这无济于事。我想要相反的行为,当我不想匹配时,我会得到匹配。
-
那我一定是完全误解了 MSDN 关于 LIKE 的文档。 “如果查询中的比较是返回所有带有字符串 LIKE 'abc'(没有空格的 abc)的行,则返回所有以 abc 开头并且有零个或多个尾随空格的行。” msdn.microsoft.com/en-us/library/ms179859.aspx
-
IMO OP 应该准确说明应该和不应该匹配的字符串,包括两边尾随空格的所有示例(数据库有“test”、“test”、“test”,你什么时候想要“测试”、“测试”和“测试”来匹配这 3 个?) OP 对 LIKE 如何工作的概念很可能是不正确的,所以如果人们回答他的问题,他将不会得到他想要的结果。他说 LIKE 不会忽略空格,但它确实会,但仅在某些情况下。 LIKE 不比较 anthony 和 itsme 发现的“完全相等”。编辑:评论系统会删除除 1 个尾随空格之外的所有内容..
标签: c# sql-server entity-framework linq-to-entities