2010-09-14 7 views
2

J'ai la méthode suivante:Pourquoi Trim() échoue-t-il dans cette expression?

 var catIds = DetachedCriteria.For<Category>() 
      .Add<Category>(c => c.TypeCode == "IMA") 
      .SetProjection(LambdaProjection.Property<Category>(s => s.Id)); 

Cela n'a rien parce que dans la retournaient base de données le champ est nchar(10). Je veux Trim() la valeur TypeCode, comme suit:

 var catIds = DetachedCriteria.For<Category>() 
      .Add<Category>(c => c.TypeCode.Trim() == "IMA") 
      .SetProjection(LambdaProjection.Property<Category>(s => s.Id)); 

mais il renvoie l'erreur NHibernate:

Unrecognised method call in epression c.TypeCode.Trim() 

Un des gars ici dans le bureau pense que c'est parce que HHibernate ne sait pas comment convertir .Trim() en SQL (ou quelque chose dans ce sens). Quelqu'un peut-il suggérer comment je peux résoudre ce problème?

Répondre

5

Essayez droit padding la valeur que vous comparez avec la longueur requise, par exemple:

string cmpValue = "IMA".PadRight(10); 

var catIds = DetachedCriteria.For<Category>() 
     .Add<Category>(c => c.TypeCode == cmpValue) 
     .SetProjection(LambdaProjection.Property<Category>(s => s.Id)); 
+0

J'ai remis ceci à plus tard parce que vous avez fourni un exemple de travail. Bon travail. – D3vtr0n

2

Vos employés de bureau sont corrects - le fournisseur de linq ne sait pas comment traduire C# string.Trim() en n'importe quelle variante sql. Pour ce qui est du correctif, linq peut vous faire faire les choses les plus fâcheuses - comme remplir vos données pour correspondre CHAR (10) plutôt que TRIM() à une chaîne «normale».

0

J'espère que le code suivant peut résoudre votre problème:

Func<string, string> trimmer = (x) => { 
        return !string.IsNullOrEmpty(x) ? x.Trim() : string.Empty; }; 

puis utilisez il comme:

var catIds = DetachedCriteria.For<Category>() 
      .Add<Category>(c => trimmer(c.TypeCode) == "IMA") 
      .SetProjection(LambdaProjection.Property<Category>(s => s.Id)); 
Questions connexes