Ich habe eine LINQ-Abfrage, um den Maximalwert einer Ganzzahlspalte abzurufen. Die Spalte ist in der Datenbank als NOT NULL definiert. Wenn Sie jedoch die MAX-Aggregatfunktion in SQL verwenden, erhalten Sie ein NULL-Ergebnis, wenn von der Abfrage keine Zeilen zurückgegeben werden.Unterschiede zwischen VB TryCast und C# "as" -Operator bei Verwendung von LINQ
Hier ist eine Beispiel-LINQ-Abfrage, die ich für die Northwind-Datenbank verwende, um zu demonstrieren, was ich mache.
var maxValue = (from p in nw.Products
where p.ProductID < 0
select p.ProductID as int?).Max();
C# analysiert diese Abfrage korrekt und maxValue hat eine Art int ?. Darüber hinaus, dass die SQL erzeugt wird, ist perfekt:
SELECT MAX([t0].[ProductID]) AS [value]
FROM [Products] AS [t0]
WHERE [t0].[ProductID] < @p0
Die Frage ist, wie code ich dies mit VB.NET und identische Ergebnisse erhalten? Wenn ich eine direkte Übersetzung mache:
dim maxValue = (from p in Products
where p.ProductID < 0
select TryCast(p.ProductID, integer?)).Max()
Ich bekomme einen Kompilierfehler. TryCast funktioniert nur mit Referenztypen, nicht mit Werttypen. TryCast & "as" sind in dieser Hinsicht etwas anders. C# macht ein bisschen mehr Arbeit mit Boxen, um Werttypen zu behandeln. Also, meine nächste Lösung ist CType statt TryCast zu verwenden:
dim maxValue = (from p in Products
where p.ProductID > 0
select CType(p.ProductID, integer?)).Max()
Dies funktioniert, aber es generiert die folgende SQL:
SELECT MAX([t1].[value]) AS [value]
FROM (
SELECT [t0].[ProductID] AS [value], [t0].[ProductID]
FROM [Products] AS [t0]
) AS [t1]
WHERE [t1].[ProductID] > @p0
Während dies richtig ist, ist es nicht sehr sauber ist. Zugegeben, in diesem speziellen Fall würde SQL Server wahrscheinlich die Abfrage so optimieren, dass sie der C# -Version entspricht. Ich kann mir Situationen vorstellen, in denen dies nicht der Fall ist. Interessanterweise erhalte ich in der C# -Version, wenn ich eine normale Umwandlung (d. H. (Int?) P.ProductID) anstelle des Operators "as" verwende, dasselbe SQL wie die VB-Version.
Weiß jemand, ob es eine Möglichkeit gibt, die optimale SQL in VB für diese Art von Abfrage zu generieren?
Dies ist Linq SQL? –
Was passiert, wenn Sie DirectCast ausprobieren? – klabranche
Ja, das ist LINQ to SQL. Wenn ich DirectCast verwende, erhalte ich einen Kompilierungsfehler. Nur CType funktioniert. –