Могу ли я сделать так, чтобы мои объекты 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»
Конечно. Проекция делает это:
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);
}
Теперь выражение может возвращать любой тип, который вы хотите использовать.