Получить запись по идентификатору, используя Entity Framework - PullRequest
0 голосов
/ 20 марта 2020

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

namespace PDS.Core.App.Data.Action.Product
{
    public class GetProducts_Action : BaseEFAction<GetProducts_Action_Request, GetProducts_Action_Response>
    {
        private CRMSContext Context { get; }
        private IMapper Mapper { get; }

        public GetProducts_Action(ILogger<GetProducts_Action> logger, CRMSContext context, ITransactionManager scope, IMapper mapper) : base(logger, context, scope)
        {
            Context = context.ValidateAndConsumeNonNullableArgument(nameof(context));
            Mapper = mapper.ValidateAndConsumeNonNullableArgument(nameof(mapper));
        }

        protected override async Task<GetProducts_Action_Response> PerformActionAsync(GetProducts_Action_Request request)
        {
            var tb_Products = await Context.TB_Products
                .ToListAsync();

            var tb_ProductsDTOs = Mapper.Map<IList<TB_ProductDTO>>(tb_Products);
            return new GetProducts_Action_Response { TB_Products = tb_ProductsDTOs };
        }
    }

    public class GetProducts_Action_Request : BaseActionRequest
    {

    }

    public class GetProducts_Action_Response : BaseActionResponse
    {
        public IList<TB_ProductDTO> TB_Products { get; set; }
    }
}

1 Ответ

1 голос
/ 22 марта 2020

Вам нужно немного написать код, если вы расширяете код, а не модифицируете его.

Во-первых, вы можете создать новый класс запросов, аналогичный GetProducts_Action_Request, который имеет ProductId, чтобы использовать его для получения одного продукта. Например, скажем, GetProduct_Action_Request:

public class GetProduct_Action_Request : BaseActionRequest
{
    public int ProductId {get; set;}
}

И объект ответа, который имеет один продукт:

public class GetProduct_Action_Response : BaseActionResponse
{
    public TB_ProductDTO TB_Product { get; set; }
}

Затем необходимо создать новое действие GetProduct_Action, аналогичное GetProducts_Action , И вы можете использовать SingleOrDefaultAsync, чтобы вернуть единственный элемент Product, который удовлетворяет условию Id:

public class GetProduct_Action : BaseEFAction<GetProduct_Action_Request, GetProduct_Action_Response>
{
    private CRMSContext Context { get; }
    private IMapper Mapper { get; }

    public GetProduct_Action(ILogger<GetProduct_Action> logger, CRMSContext context, ITransactionManager scope, IMapper mapper) : base(logger, context, scope)
    {
        Context = context.ValidateAndConsumeNonNullableArgument(nameof(context));
        Mapper = mapper.ValidateAndConsumeNonNullableArgument(nameof(mapper));
    }

    protected override async Task<GetProduct_Action_Response> PerformActionAsync(GetProduct_Action_Request request)
    {
        var tb_Product = await Context.TB_Products.SingleOrDefaultAsync(i=> i.Id == request.ProductId);

        var tb_ProductDTO = Mapper.Map<IList<TB_ProductDTO>>(tb_Product);
        return new GetProduct_Action_Response { TB_Product = tb_ProductDTO };
    }
}

public class GetProduct_Action_Request : BaseActionRequest
{
    public int ProductId {get; set;}
}

public class GetProduct_Action_Response : BaseActionResponse
{
    public TB_ProductDTO TB_Product { get; set; }
}

Поэтому у вас есть 2 действия GetProduct_Action для одного продукта на основе Id и GetProducts_Action для списка всех продуктов.

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