Heim >Backend-Entwicklung >C++ >Wie vermeide ich „Cast Failed'-Fehler beim Summieren von Nullable-Ganzzahlen in LINQ?

Wie vermeide ich „Cast Failed'-Fehler beim Summieren von Nullable-Ganzzahlen in LINQ?

Linda Hamilton
Linda HamiltonOriginal
2025-01-10 20:56:45665Durchsuche

How to Avoid

Umgang mit Nullwerten in LINQ-Abfragen: Beheben des Fehlers „Konvertierung fehlgeschlagen“

Beim Ausführen einer LINQ-Abfrage stoßen Entwickler möglicherweise auf den Fehler: „Kann nicht in den Werttyp ‚Int32‘ konvertiert werden, da der materialisierte Wert null ist.“ Dieses Problem tritt auf, wenn versucht wird, einen nullbaren Wert in einen nicht nullbaren Werttyp „hour“ zu konvertieren .

Die folgende LINQ-Abfrage veranschaulicht diese Situation:

<code>var creditsSum = (from u in context.User
                  join ch in context.CreditHistory on u.ID equals ch.UserID                                        
                  where u.ID == userID
                  select ch.Amount).Sum();</code>

Diese Abfrage berechnet die Summe der Spalte „Betrag“ für eine bestimmte Benutzer-ID in der CreditHistory-Tabelle. Wenn jedoch in der CreditHistory-Tabelle kein Datensatz für den angegebenen Benutzer vorhanden ist, gibt der ch.Amount-Ausdruck null zurück. Dieser Nullwert kann nicht in den nicht nullbaren Werttyp Int32 konvertiert werden, was zu einem Fehler führt.

Lösung: Umgang mit Nullwerten

Um nullbare Werte in LINQ-Abfragen zu verarbeiten, gibt es zwei mögliche Ansätze:

  1. DefaultIfEmpty verwenden: Diese Methode fügt den Abfrageergebnissen einen Standardwert hinzu, wenn keine Zeilen zurückgegeben werden. Im gegebenen Szenario kann die Abfrage wie folgt geändert werden:
<code>var creditsSum = (from u in context.User
                  join ch in context.CreditHistory on u.ID equals ch.UserID                                        
                  where u.ID == userID
                  select ch.Amount).DefaultIfEmpty(0).Sum();</code>
  1. Verwendung des Bedingungsoperators (??): Mit dem Bedingungsoperator (??) können Sie einen Standardwert angeben, der im Falle eines Nullergebnisses verwendet werden soll. Die Abfrage kann wie folgt umgeschrieben werden:
<code>var creditsSum = (from u in context.User
                  join ch in context.CreditHistory on u.ID equals ch.UserID                                        
                  where u.ID == userID
                  select (int?)ch.Amount).Sum() ?? 0;</code>

In dieser Version konvertiert der Ausdruck (int?)ch.Amount den Wert explizit in int?, was darauf hinweist, dass er null sein kann. Der nachfolgende ??-Operator ersetzt alle Nullwerte durch den Standardwert 0.

Durch die Implementierung einer dieser beiden Methoden kann die Abfrage erfolgreich Nullwerte verarbeiten und die gewünschten Ergebnisse zurückgeben.

Das obige ist der detaillierte Inhalt vonWie vermeide ich „Cast Failed'-Fehler beim Summieren von Nullable-Ganzzahlen in LINQ?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn