Подтвердить что ты не робот

Только получить конкретные столбцы

Могу ли я заставить объекты 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'

4b9b3361

Ответ 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);
}

Теперь выражение может возвращать любой тип, который вы хотите использовать.