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, а второй - быстрее, потому что должно быть реализовано только одно значение столбца.