Получить только определенные столбцы - PullRequest
40 голосов
/ 07 октября 2009

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

54 голосов
/ 07 октября 2009

Конечно. Проекция делает это:

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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...