我使用Linq和Entity Framework Code First首先查詢MS SQL數據庫。要求是能夠對該表運行WHERE SomeColumn LIKE '%sometext'
子句。如何更改由linq-to-entities生成的sql?
此,從表面上看,是一個簡單的要求,可以用一個簡單的Linq查詢這樣來完成:
var results = new List<MyTable>();
using(var context = new MyContext())
{
results = context.MyTableQueryable
.Where(x => x.SomeColumn.EndsWith("sometext"))
.ToList();
}
// use results
然而,這不是有效的做法。問題似乎是SomeColumn
列不是varchar,而是char(31)。這意味着如果一個字符串保存在少於31個字符的列中,那麼在字符串的末尾會添加空格以確保長度爲31個字符,並且會對.EndsWith()
查詢產生影響。
我使用SQL事件探查器來查找從.EndsWith()
方法中生成的確切的SQL。以下是我發現:
--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE N'%sometext'
所以即很有趣。我不確定在'%sometext'
之前N
是什麼意思。 (我將在後面google一下。)但我知道,如果我採取相同的查詢,並在SSMS沒有N
像這樣運行:
--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE '%sometext'
然後查詢工作正常。有沒有辦法讓Linq和Entity Framework從查詢中刪除N
?
''N''基本上意味着它將你的字符串視爲一個varchar,這可能是你的問題。 – Kippie
[VARCHAR和NVARCHAR](http://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar)。至於你得到的錯誤,它確實看起來很奇怪,而不是我遇到過的問題,但是我再次只在最近的數據庫中使用'NVARCHAR'而沒有問題。 – XN16
@ XN16 - 我更喜歡nvarchar。不幸的是,我不能在這種情況下使用它。 – quakkels