2009-11-23 7 views
1
public ActionResult Index(string title) 
    { 
     var post = (from p in dataContext.Posts 
        where RemoveChar(p.Title) == title && !p.Deleted 
        select p).Single(); 

     post.Visit = post.Visit + 1; 

     dataContext.SubmitChanges(); 

     return View(new ViewData.PostIndexViewData(post)); 
    } 

    public string RemoveChar(string Item) 
    { 
     var s = from ch in Item 
       where !Char.IsPunctuation(ch) 
       select ch; 
     var bytes = UnicodeEncoding.ASCII.GetBytes(s.ToArray()); 
     var stringResult = UnicodeEncoding.ASCII.GetString(bytes); 
     return stringResult; 
    } 

Est-ce possible avec System 'System.String RemoveChar (System.String)' n'a pas de traduction supportée par SQL.Linq2Sql remove char

+0

Ouais désolé post a frappé avant que je l'ai terminé: P – John

Répondre

1

Non, vous ne pouvez pas utiliser vos propres méthodes personnalisées au sein LINQ to SQL comme ça - il ne saurait pas comment les traduire en SQL. (L'arbre d'expression contient juste un appel à RemoveChar - il ne construit pas un arbre d'expression pour représenter le code dans RemoveChar.) Je ne suis pas sûr qu'il ya une façon particulièrement agréable de le faire - vous pouvez être en mesure d'écrire un fonction définie par l'utilisateur ou procédure stockée et mappé de façon appropriée dans LINQ. (Heck, vous pouvez utiliser une fonction définie par l'utilisateur CLR si vous utilisez SQL Server et avez des DBA prêts.)

J'ajouterais que votre implémentation de RemoveChar est loin d'être idéale à certains égards - je suggère d'utiliser Regex.Replace à la place, pour la suppression de ponctuation en cours de processus.

+0

Et vous devez ajouter le 'Regex.Replace' au principal droit de requête LINQ? pas envelopper dans une autre fonction? –

+0

@cottsak: Je doute que Regex.Replace soit supporté dans les traductions LINQ to SQL. C'est possible, mais peu probable. Ça vaut le coup d'essayer, je suppose. –

0

Le problème est que vous mélangez une fonction locale dans une expression LINQ LINQ to SQL veut traduire en SQL pour envoyer au serveur.

Pour résoudre cela, vous aurez besoin de charger la liste complète des messages et d'interroger le résultat dans la mémoire qui est probablement moins qu'idéal.

Je pense que vous avez besoin de faire un changement à l'application - vous devriez être en mesure de rechercher la base de données avec une clé qui ne nécessite pas que les données contenues dans la base de données est modifiée pour correspondre. Je suggère que vous ajoutiez une colonne "SearchTitle" qui est le titre avec la ponctuation enlevée selon votre exemple, puis votre requête devient trivial (et plus efficace) au prix d'une petite quantité d'espace supplémentaire dans votre base de données.