2011-06-01 4 views
1
var depts = ctx.Departments 
      .OrderBy(d => d.deptName) 
      .Select(d => d.deptNo); 

foreach (int deptNumber in depts) { 
    var deptReports = from d in ctx.Departments 
         join r in matchingIncidents on d.deptNo equals r.deptNo 
         where r.deptNo == deptNumber 
         select r; 

    int deptReportsCount = deptReports.Count(); 

Je suis complètement déconcerté! Toutes les questions à propos de cette erreur disent d'utiliser == sur les champs primitifs (comme les IDs), ce que je fais. Tout ce que je fais à cette requête génère l'exception. Le même code a fonctionné avant et je ne sais pas ce que j'ai fait! Est-ce que quelqu'un pourrait m'expliquer s'il vous plaît ce qui se passe?Entity Framework - NotSupportedException

Aussi, je me souviens qu'il y avait une classe EntityFramework avec des méthodes qui vous permettaient de convertir des objets dans une requête (par exemple des dates), est-ce que quelqu'un sait ce qu'est cette classe?

MISE À JOUR:

Voici les changements que j'ai fait (cela fonctionne maintenant).

var deptReports = from r in matchingIncidents 
        join d in ctx.Departments on r.deptNo equals d.deptNo 
        where r.deptNo == deptNumber 
        select r; 
+0

est '' matchingIncidents' un IQueryable' ou une liste d'objets qui sont déjà chargés dans la mémoire? Si c'est une collection en mémoire, gardez à l'esprit que le 'JOIN 'dans votre code UPDATE ne se produira pas dans la base de données mais dans la mémoire - ce qui signifie: Toute la table' Departments' sera chargée en mémoire avant la jointure Mémoire. – Slauma

Répondre

2

matchingIncidents ressemble à une collection locale d'un type complexe (parce que vous utilisez r.deptNo). Cela n'est pas autorisé dans LINQ aux entités. Vous pouvez essayer ceci:

foreach (int deptNumber in depts) { 
    var deptReports = from d in ctx.Departments 
         join r in matchingIncidents.Select(m => m.deptNo) 
          on d.deptNo equals r 
         where r == deptNumber 
         select r; 

int deptReportsCount = deptReports.Count(); 

matchingIncidents.Select(m => m.deptNo) est maintenant une collection locale des types primitifs et deptReports est une séquence de int (en supposant que deptNo est de type int). Mais pour compter les éléments qui en résultent, ça devrait être encore bien.

Modifier

Et vous êtes probablement la recherche de classe la EntityFunctions statique:

http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx

+0

Merci! C'est ce que j'ai changé (en essayant de refactoriser/optimiser mon code). Et vous êtes sur la classe EntityFunctions aussi! Vous êtes mon héros :) – Lifes

+0

Pour toute personne bloquée sur ce problème, matchingIncidents est une liste d'objets Incident d'une requête précédente. – Lifes

0

Peut-être la question:

join r in matchingIncidents on d.deptNo == r.deptNo 
+0

Cela fait partie de la syntaxe de jointure. Le sortir entraîne une erreur de syntaxe. – Lifes