2017-09-15 3 views
1

Sensible je une table qui le nom Post qui a une colonne nommée key:Entity Framework cas de requête

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

Comme vous pouvez le voir la première valeur key d'un Post est WM (Majuscule) et la seconde valeur key est wm (minuscule).

Lorsque j'exécute la requête avec le code suivant:

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

Je passe le key avec une valeur (wm et WM), mais obtenir un résultat. Le deuxième (wm).

J'ai cherché la solution et trouvé ce question et ce answer. Après avoir essayé d'utiliser la réponse et mettre en œuvre l'annotation de données [CaseSensitive] lorsque je recherche wm je reçois le premier message et quand je recherche WM je reçois null. Comment puis-je résoudre ce problème et obtenir un message adéquat avec la clé?

Mise à jour: Generated SQL Query:

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

Avez-vous vérifié pour vous assurer que votre colonne DB configuration était avec le classement correct? Personnellement je m'en tenir à faire '.Where (o => o.Key == clé) .AsEnumerable(). Où (o => o.Key == clé)'. – juharr

+0

Vérifiez dans votre base de données quel est le type de votre colonne 'Key'. –

+0

@ m.rogalski string –

Répondre

1

Je résoudre ce problème avec la même changement:

  1. changement Key type de données à varchar

  2. et exécuter SQL Query avec 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

Ne peut pas croire que cela aide. Vous utilisez un classement sensible à la casse (CS). –

+0

Case sensible est ce qu'il/elle veut @GertArnold. – mjwills

+0

Hmm, probablement. La description du problème n'est pas la plus claire que j'ai jamais vue. –