2008-09-27 16 views
2

J'ai commencé à jouer avec Linq aujourd'hui et j'ai rencontré un problème auquel je n'ai pas trouvé de réponse. Je demandais une base de données SQL Server simple qui avait des enregistrements d'employés. L'un des champs est le nom complet (cn). J'ai pensé qu'il serait intéressant de regrouper par le prénom en divisant le nom complet au premier espace. J'ai essayéGroupe LINQ par question

group by person.cn.Split(separators)[0] 

mais couru dans une longue exception d'exécution (ressemblait beaucoup à une erreur d'instanciation de modèle C++).

Alors j'ai essayé groupant par quelques lettres du prénom:

group by person.cn.Substring(0,5) 

et qui a bien fonctionné, mais n'est pas ce que je veux.

Je me demande deux choses:

  • Pourquoi le premier exemple ne fonctionne pas quand il a l'air si proche de la seconde?
  • Sachant que dans les coulisses, il est des choses SQL en cours, ce qui est une bonne façon de faire ce genre de chose efficacement

Merci,

Andrew

+0

Pouvez-vous ajouter le message d'exception? C'est important de le faire quand vous en avez un. –

Répondre

2

Split a pas de traduction dans SQL. Alors, comment faire cette manipulation de chaîne sans split?

Cheat comme l'enfer (non testé):

string oneSpace = " "; 
string fiftySpace = "             "; 

var query = 
    from person in db.Persons 
    let lastname = person.cn.Replace(oneSpace, fiftySpace).SubString(0, 50).Trim() 
    group person by lastname into g 
    select new { Key = g.Key, Count = g.Count }; 
1

La raison pour laquelle votre première tentative ne fonctionne pas parce que LINQ to SQL utilise les arbres d'expression pour traduire votre requête dans SQL. Par conséquent, tout code qui n'est pas directement traduisible en SQL est une exception - cela inclut l'appel à Split.

1

Merci les gars, je vais essayer le "Remplacer" astuce pour voir si cela fonctionne. Je suis très intrigué par LINQ mais maintenant il semble qu'il y ait un mystère caché où vous devez savoir ce que vos requêtes LINQ traduisent avant de pouvoir l'utiliser efficacement.

Le problème principal est bien sûr que je ne connais pas très bien le SQL, donc c'est là que je vais commencer.

Edit:

J'ai finalement essayé le "remplacer" aujourd'hui et cela fonctionne. J'ai même pu trier les résultats groupés en nombre donc maintenant j'ai un nom de famille dans mon entreprise. C'est horriblement lent, cependant. Beaucoup plus rapide pour tout sélectionner et faire le seau en C# directement.

Merci encore,

Andrew

+0

Vraiment, il suffit de savoir quelles méthodes .NET sont traduisibles en SQL - vous n'avez pas vraiment besoin de savoir * comment * elles sont traduites. Bien que ce soit utile. =) –

+0

Je dirais que vous devriez avoir une bonne idée de ce qui est envoyé à la base de données et de ce que la base de données en fera. Les méthodes LinqToObjects et LinqToSql devraient être facilement séparées par le lecteur du code (ToList est un bon séparateur). –