Я возился с LinqToSQL и LINQPad и заметил, что SingleOrDefault () не выполняет никакой фильтрации или ограничения в сгенерированном SQL (я почти ожидал эквивалент Take (1)).
Итак, если вы хотите защитить себя от случайного возвращения больших количеств, будет ли полезен следующий фрагмент или это плохая идея?
// 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;
}
В отличие от обычного способа, которым я бы это сделал (уведомление №. Возьмите (2))
public SingleType getSingle(int id)
{
var query = from s in Singles where s.ID == id select s;
var result = query.SingleOrDefault();
return result;
}
Я решил, что с Take (2) я все равно получу функциональность SingleOrDefault () с дополнительным преимуществом - никогда не придется беспокоиться о случайном возвращении {n} строк, но я не уверен, стоит ли это того если только я не собираюсь случайно вернуть {n} строк с моим запросом.
Итак, стоит ли это? Это вредно? Есть ли какие-то плюсы / минусы, которых я не вижу?
Edit:
SQL, сгенерированный без Take (2)
SELECT [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
SQL, созданный с помощью Take (2)
SELECT TOP 2 [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
Кроме того, когда я говорю о функциональности SingleOrDefault, я специально хочу, чтобы он генерировал исключение, если возвращается 2 или более, поэтому я делаю "Take (2)". Разница в том, что без .Take (2) он будет возвращать {n} строк из базы данных, когда ему действительно нужно будет вернуть только 2 (этого достаточно, чтобы его выбросило).