Ich habe mit LinqToSQL und LINQPad herumgespielt und bemerkt, dass SingleOrDefault() in der generierten SQL keine Filterung oder Begrenzung vornimmt (ich hatte fast das Äquivalent von Take(1) erwartet).
Angenommen, Sie wollten sich davor schützen, dass große Mengen versehentlich zurückgeschickt werden, wäre dann das folgende Snippet nützlich oder eine schlechte Idee?
// SingleType is my LinqToSQL generated type
// Singles is the table that contains many SingleType's
// context is my datacontext
public SingleType getSingle(int id)
{
var query = from s in context.Singles where s.ID == id select s;
var result = query.Take(2).SingleOrDefault();
return result;
}
Im Gegensatz zu dem normalen Weg, den ich gewählt hätte (beachten Sie, dass .Take(2) fehlt)
public SingleType getSingle(int id)
{
var query = from s in Singles where s.ID == id select s;
var result = query.SingleOrDefault();
return result;
}
Ich dachte, mit der Take(2), ich würde immer noch die Funktionalität von SingleOrDefault() mit dem zusätzlichen Vorteil der nie zu kümmern, über die Rückkehr {n} Zeilen versehentlich, aber ich bin nicht sicher, wenn seine sogar wert, es sei denn, ich bin ständig erwarten, um versehentlich {n} Zeilen mit meiner Abfrage zurück.
Lohnt sich das also? Ist es schädlich? Gibt es irgendwelche Vor- oder Nachteile, die ich nicht sehe?
Edit :
SQL generiert ohne den Take(2)
SELECT [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
Mit Take(2) erzeugtes SQL
SELECT TOP 2 [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
Auch, wenn ich spreche von SingleOrDefault-Funktionalität, ich speziell Wunsch zu haben, es werfen eine Ausnahme, wenn 2 oder mehr zurückgegeben werden, weshalb ich eine "Take(2)" tun bin. Der Unterschied ist, ohne die .Take(2), wird es {n} Zeilen aus der Datenbank zurückgeben, wenn es wirklich nur 2 zurückgeben muss (gerade genug, um es zu werfen).