2017-09-15 74 views
1

我有一個名爲Post其中有一個名爲key一欄表:實體框架區分大小寫查詢

Id | Key | Title 
-------------------- 
    1 | WM | First 
-------------------- 
    2 | wm | Second 

正如你可以看到Post的第一keyWM(大寫)和第二key值是wm(小寫)。

當我執行與下面的代碼查詢:

var post = await _posts.Where(o => o.Key == key).Select(o => new 
    { 
     id = o.Id, 
     title = o.Title 
    }).SingleOrDefaultAsync(); 

我通過key一個值(WM和WM)卻得到一個結果。第二個(wm)。

我已經搜索瞭解決方案,發現這個question 和這個answer。當我試圖使用答案並執行[CaseSensitive]數據註釋當我搜索wm我回來的第一篇文章,當我搜索WM我得到null。 我該如何解決這個問題,並獲得一個關鍵的充足的職位?

更新: 生成的SQL查詢:

SELECT [Limit1].[C1] AS [C1], 
     [Limit1].[Id] AS [Id], 
     [Limit1].[Title] AS [Title] 
FROM (SELECT TOP (2) [Extent1].[Id] AS [Id], 
         [Extent1].[Title] AS [Title], 
         1     AS [C1] 
     FROM [dbo].[Posts] AS [Extent1] 
     WHERE ([Extent1].[Key] = 'wm' /* @p__linq__0 */) 
       OR (([Extent1].[Key] IS NULL) 
        AND ('wm' /* @p__linq__0 */ IS NULL))) AS [Limit1] 
+1

你檢查,以確保您的數據庫列是設置與正確的排序規則?就個人而言,我會堅持做'.Where(o => o.Key == key).AsEnumerable()。where(o => o.Key == key)'。 – juharr

+0

檢查你的數據庫'Key'列的類型。 –

+0

@ m.rogalski字符串 –

回答

1

我解決這個問題具有同樣的變化:

  1. 變化Key數據類型varchar

  2. 和執行SQL查詢與SqlQuery<T>

    var post = await _uow.Database 
          .SqlQuery<PostUrlDto>(
           "SELECT Id , Title FROM Posts WHERE [Key] = @postkey COLLATE SQL_Latin1_General_CP1_CS_AS", 
           new SqlParameter("postkey", postkey)).SingleOrDefaultAsync() 
    
+0

不能相信這有助於。您使用區分大小寫的排序規則(CS).. –

+0

區分大小寫是他/她想要的@GertArnold。 – mjwills

+0

嗯,可能。問題描述不是我見過的最清楚的。 –