Frage

Ich habe eine Linq to Entities wie diese Abfrage:

var results = from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == (int)pCategory
              select r;

Normalerweise verwende ich den Code zu überprüfen, ob einige Ergebnisse zurückgegeben werden:

if (results.Count() > 0)
{
    return new oMachineRevision(results.First().IdMachineRevision);
}

Aber ich bin immer NotSupportedException in dem , wenn Zustand.

Die Fehlermeldung lautet: kann nicht einen konstanten Wert des Typs ‚Schliessenart‘ erstellen. Nur primitive Typen ( 'wie Int32, String, und Guid') sind in diesem Zusammenhang unterstützt.

Beachten Sie, dass pCategory ist ein Enum-Typ.

War es hilfreich?

Lösung

Bearbeiten : Basierend auf dem Update, der Fehler kann zu einer Enum in Ihrer Entity-Klasse in Beziehung gesetzt werden. Sehen Sie diesen Blogeintrag für weitere Informationen und eine Arbeits -um. Ich meine ursprüngliche Antwort als eine Verbesserung auf Ihrer Abfragesyntax zu verlassen.

Versuchen Sie, die Auswahl der ersten Einheit in der Abfrage zu tun selbst FirstOrDefault verwenden und dann prüfen, ob das Ergebnis null ist.

int compareCategory = (int)pCategory; // just a guess
var result = (from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == compareCategory
              select r).FirstOrDefault();

if (result != null)
{
     return new oMachineRevision(result.IdMachineRevision);
}

Andere Tipps

Warum nicht einfach verwenden FirstOrDefault () statt, und überprüfen Sie auf null? Ich kann nicht den Nutzen in der Abfrage für die Zählung sehen und dann das erste Element unter.

In der Standardimplementierung von Linq „die Option“ die Betreiber und „wo“ Methoden zuordnen, die eine IEnumerable oder IQueryable zurückgeben. So Standard Linq Methoden, wenn verwendet wird, sollte immer eine IEnumerable aus der Abfrage nicht ein einzelnes Objekt zurück.

Aber Linq Methoden, die Kandidaten für die Linq-Operatoren sind, nicht auf Verfahren beschränkt IEnumerables Rückkehr, jede Methode etwas Rückkehr gewählt werden kann.

Falls Sie Instanzmethoden genannt „Select“ haben und „Wo?“, Die ein einzelnes Objekt oder Erweiterungen Methoden zurück, die zu Ihrer Klasse spezifisch sind und geben ein einzelnes Objekt diejenigen, wird anstelle der Standard Linq diejenigen verwendet werden.

Meine Vermutung ist, dass entweder ein „Select“ oder „Wo“ Methode in der Klasse definiert macht Linq anstelle eines IEnumerable<T> einen einzelnen Wert zurück.

Ich wusste nicht, andere anonyme Objekte würden je nach Abfrageergebnis erstellt werden. Ich denke, sie nur Ergebnisse wollte vom Typ IEnumerable sein

Wie wäre es ein foreach mit?

var results = from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == pCategory
              select r;

foreach( var r in results )
{
    yield return new oMachineRevision( r.IdMachineRevision );
}

Das gilt für alle impliziten Typen zu. Ich muss ich zugeben, halten dies zu vergessen und das ist, wie ich auf diesen Beitrag kam.

Wenn Sie

class ClassA {
               ...

               private string value;

               ...

               public static implicit operator string(ClassA value)
               {
                    return value.ToString();
               } 

              ...
}

Sie müssen explictly die Klasse zu astring zum Vergleich gegossen.

so dass ich dies in der Regel tun

    var myClassAStr = myClassA.ToString();

    var x = (from a in entites where a.ValToCompare == myClassAStr select a).first();

// do stuff with x
    ...

versuchen Sie es mit

IENumerable<MachineRevision> results = from r in entities.MachineRevision
...

statt.

Ich denke, die das var die das Problem verursacht.

Edit:

Lesen Sie die Fehlermeldung. „Kann nicht einen konstanten Wert des Typs‚Schliessenart‘. Nur primitive Typen erstellen (‚wie Int32, String, und Guid‘) sind in diesem Zusammenhang unterstützt.“

Eine dieser Vergleiche ist mit einem Typ, der nicht, String oder GUID ist int. Ich vermute, die Kategorie.

r.Machine.IdMachine == pIdMachine && r.Category == pCategory

Interessanterweise LinqToSql wird diese Konstruktion ermöglichen. Sie wissen nicht, warum LinqToEntities dies nicht unterstützt.

Ich glaube, Sie auch das Element auswählen können Sie ein anderes wollen, einfache Art und Weise durch Lambda-Ausdrücke verwenden.

var result = entities.MachineRevision
                 .Where(x => x.Machine.IdMachine == pIdMachine)
                 .Where(y => y.Category == (int)pCategory)
                 .FirstOrDefault();

if (result != null)
{
     return new oMachineRevision(result.IdMachineRevision);
}

und dann fortfahren, wie Sie es normalerweise

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top