LINQ Выберите первую
Привет, у меня есть этот бит кода linq
var fp = lnq.attaches.First(a => a.sysid == sysid).name;
При профилировании он генерирует следующий t-sql
SELECT TOP (1) [t0].[sysid], [t0].[name], [t0].[att_size], [t0].[cid], [t0].[flags], [t0].[contents]
FROM [lntmuser].[attach] AS [t0]
Как я смотрю на него, он возвращается как select *, который заставит запрос выполнять сканирование таблицы, а затем использовать индекс. Плохо для производительности.
Как я могу выбрать только столбец имен, например:
SELECT TOP (1)[t0].[name] FROM [lntmuser].[attach] AS [t0]
Заранее спасибо
Изменить:
Разбитые профили раствора по желанию
SELECT TOP (1) [t0].[name]
FROM [lntmuser].[attach] AS [t0]
WHERE [t0].[sysid] = @p0
Ответы
Ответ 1
Спроектируйте свойство name
перед использованием First()
:
var fp = lnq.attaches.Where(a => a.sysid == sysid)
.Select(a => a.name)
.First();
Это не изменяет использование индекса, хотя - для этого ваш оператор Where
отвечает (в вашем первоначальном запросе лямбда вы перешли на First()
). Оба запроса извлекают выгоду из индекса в столбце name
, а второй - быстрее, потому что должно быть реализовано только одно значение столбца.