предложение linq store select в качестве переменной функции - PullRequest
1 голос
/ 21 марта 2020

есть ли способ сохранить предложение select оператора linq как переменную?

У меня есть следующий класс, и предложение select повторяется, могу ли я как-то сохранить его как переменную, чтобы я не стал нужно повторить?

 public class TractRepository : ITractRepository
    {
        private DataContext context;

        public TractRepository(DataContext ctx) => context = ctx;
        public async Task<IEnumerable<Tract>> GetAllAsync() => 
            await context.Tracts.Include(p => p.ContractType).Include(p => p.ContractSubType).OrderByDescending(p => p.Id)
            .Select(p => new Tract
            {
                Id = p.Id,
                Acreage = p.Acreage,
                Administrative = p.Administrative,
                ContractType = new ContractType
                {
                    Id = p.ContractType.Id,
                    ContractTypeName = p.ContractType.ContractTypeName
                },
                ContractSubType = new ContractSubType
                {
                    Id = p.ContractSubType.Id,
                    ContractSubTypeName = p.ContractSubType.ContractSubTypeName
                }
            })
            .ToListAsync();

        public async Task<Tract> GetByIdAsync(long id) =>
            await context.Tracts.Include(p => p.ContractType).Include(p => p.ContractSubType)
             .Select(p => new Tract
             {
                 Id = p.Id,
                 Acreage = p.Acreage,
                 Administrative = p.Administrative,
                 ContractType = new ContractType
                 {
                     Id = p.ContractType.Id,
                     ContractTypeName = p.ContractType.ContractTypeName
                 },
                 ContractSubType = new ContractSubType
                 {
                     Id = p.ContractSubType.Id,
                     ContractSubTypeName = p.ContractSubType.ContractSubTypeName
                 }
             }).FirstOrDefaultAsync(p => p.Id == id);

    }

1 Ответ

3 голосов
/ 21 марта 2020

Вы можете извлечь все общее IQueryable<T> для разделения свойства / метода. Поскольку запросы LINQ не выполняются до перечисления (так называемое отложенное выполнение), его можно использовать в качестве базы для составления других запросов, например

private IQueryable<Tract> Query() => context.Tracts
    //.Include(p => p.ContractType)
    //.Include(p => p.ContractSubType)
    .Select(p => new Tract
    {
        Id = p.Id,
        Acreage = p.Acreage,
        Administrative = p.Administrative,
        ContractType = new ContractType
        {
            Id = p.ContractType.Id,
            ContractTypeName = p.ContractType.ContractTypeName
        },
        ContractSubType = new ContractSubType
        {
            Id = p.ContractSubType.Id,
            ContractSubTypeName = p.ContractSubType.ContractSubTypeName
        }
    });

(Include s являются избыточными (игнорируются) для проекции ( Select) запросов)

, затем

public async Task<IEnumerable<Tract>> GetAllAsync() => 
    await Query().OrderByDescending(p => p.Id).ToListAsync();

и

public async Task<Tract> GetByIdAsync(long id) =>
    await Query().FirstOrDefaultAsync(p => p.Id == id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...