Только получить конкретные столбцы
Могу ли я заставить объекты EF извлекать только определенные столбцы в выполненном sql? Если я выполняю приведенный ниже код для извлечения объектов, есть ли что-то, что я могу сделать, чтобы получить только определенные столбцы, если они нужны?
public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp)
{
return _ctx.CreateQuery<T>(typeof(T).Name).Where<T>(exp);
}
Это создало бы предложение select, содержащее все столбцы. Но если у меня есть столбец, содержащий большой объем данных, который действительно замедляет запрос, как я могу удалить мои объекты из этого столбца из сгенерированного sql?
Если в моей таблице есть Id (int), Status (int), Data (blob), как я могу сделать свой запрос
select Id, Status from TableName
вместо
select Id, Status, Data from TableName
Из приведенного ниже предложения мой метод
public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp, Expression<Func<T, T>> columns)
{
return Table.Where<T>(exp).Select<T, T>(columns);
}
И я называю это так
mgr.GetBy(f => f.Id < 10000, n => new {n.Id, n.Status});
Однако я получаю ошибку компиляции:
Невозможно неявно преобразовать тип 'AnonymousType # 1' в 'Entities.BatchRequest'
Ответы
Ответ 1
Конечно. Проекция делает это:
var q = from r in Context.TableName
select new
{
Id = r.Id,
Status = r.Status
}
Вот пример (очевидно, у моей БД есть разные таблицы, чем у вас). Я добавил свою модель EF в LINQPad и набрал следующий запрос:
from at in AddressTypes
select new
{
Id = at.Id,
Code = at.Code
}
LINQPad показывает мне, что сгенерированный SQL:
SELECT
1 AS [C1],
[Extent1].[AddressTypeId] AS [AddressTypeId],
[Extent1].[Code] AS [Code]
FROM
[dbo].[AddressType] AS [Extent1]
Ни одно из других полей из таблицы не включено.
Отвечая на обновленный вопрос
В аргументе columns
указано, что он принимает тип T и возвращает тот же тип. Следовательно, переданное вами выражение должно соответствовать этому, или вам нужно изменить тип аргумента, т.е.:
public IEnumerable<U> GetBy<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> columns)
{
return Table.Where<T>(exp).Select<T, U>(columns);
}
Теперь выражение может возвращать любой тип, который вы хотите использовать.