Как запросить сущность и вернуть JSON вопрос - PullRequest
0 голосов
/ 30 апреля 2019

У меня проблемы с запросом объектов в моей базе данных. У меня есть asp.net Web API 2. По сути, запрос приходит к методу действия, и в соответствии с некоторыми данными запроса я пытаюсь запросить объекты и ответить обратно JSON.

Вот мои 2 сущности, которые я пытаюсь запросить:

! [GameBanks] http://i65.tinypic.com/1m7v6.png

! [GameCouponBanks] http://i65.tinypic.com/2wnsf15.png

В GameBanks может быть более одного кода продукта в соответствии с unitPrice. (5,10,15) У меня есть серийные номера и контакты в GameCouponBanks. Если я запрашиваю только 1 количество из GameBanks, то нет проблем Ответ JSON в порядке.

Вот пример запроса:

var gameBankResultVM = await (context.GameBanks.Where(g => g.productCode == "000000006446")
                    .Where(l => l.referenceId == initiate.referenceId)
                    .Take(1)
                    .Select(g => new 
                    {
                        g.quantity,
                        g.version,
                        g.currency,
                        g.initiationResultCode,
                        g.productCode,
                        g.productDescription,
                        g.referenceId,
                        g.unitPrice,
                        g.totalPrice,
                        g.companyToken,
                        g.ApplicationCode,
                        g.estimateUnitPrice,
                        g.validatedToken,
                        coupons = g.coupons.Select(c => new
                        {
                            c.Pin,
                            c.Serial,
                            c.expiryDate
                        }).ToList()
                    })).ToListAsync();

И ответ JSON выглядит так, как я хочу.

{
        "quantity": 1,
        "version": "V1",
        "currency": "TRY",
        "initiationResultCode": "00",
        "productCode": "000000006446",
        "productDescription": "400 Riot Points - 400 RP",
        "referenceId": "48900000492",
        "unitPrice": 10,
        "totalPrice": 10,
        "companyToken": "",
        "ApplicationCode": null,
        "estimateUnitPrice": 0,
        "validatedToken": null,
        "coupons": [
            {
                "Pin": "abcde",
                "Serial": "12345",
                "expiryDate": null
            },
            {
                "Pin": "jjjjj",
                "Serial": "77777",
                "expiryDate": null
            }
        ]
    }

Но если я запрашиваю более 1 количества продукта, мне нужно как-то сгруппировать их по GameBanks. Потому что ответ JSON выглядит так, чего я не хочу.

[
    {
        "quantity": 1,
        "version": "V1",
        "currency": "TRY",
        "initiationResultCode": "00",
        "productCode": "000000006446",
        "productDescription": "400 Riot Points - 400 RP",
        "referenceId": "48900000492",
        "unitPrice": 10,
        "totalPrice": 10,
        "companyToken": "",
        "ApplicationCode": null,
        "estimateUnitPrice": 0,
        "validatedToken": null,
        "coupons": [
            {
                "Pin": "abcde",
                "Serial": "12345",
                "expiryDate": null
            },
            {
                "Pin": "jjjjj",
                "Serial": "77777",
                "expiryDate": null
            }
        ]
    },
    {
        "quantity": 1,
        "version": "V2",
        "currency": "TRY",
        "initiationResultCode": "00",
        "productCode": "000000006446",
        "productDescription": "500",
        "referenceId": "48900000492",
        "unitPrice": 15,
        "totalPrice": 15,
        "companyToken": null,
        "ApplicationCode": null,
        "estimateUnitPrice": 0,
        "validatedToken": null,
        "coupons": [
            {
                "Pin": "ABNDJK",
                "Serial": "00000",
                "expiryDate": null
            }
        ]
    }
]

Мне нужно сложить цены за единицу и вернуть JSON следующим образом. (Пожалуйста, проверьте количество = 2, unitPrice = 10, totalPrice = 20 и купоны)

{
        "quantity": 2,
        "version": "V1",
        "currency": "TRY",
        "initiationResultCode": "00",
        "productCode": "000000006446",
        "productDescription": "400 Riot Points - 400 RP",
        "referenceId": "48900000492",
        "unitPrice": 10,
        "totalPrice": 20,
        "companyToken": "",
        "ApplicationCode": null,
        "estimateUnitPrice": 0,
        "validatedToken": null,
        "coupons": [
            {
                "Pin": "abcde",
                "Serial": "12345",
                "expiryDate": null
            },
            {
                "Pin": "jjjjj",
                "Serial": "77777",
                "expiryDate": null
            },{
                "Pin": "CENK",
                "Serial": "131313",
                "expiryDate": null
            }

        ]
    }

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

(GameBanks.Where(g => g.ProductCode == "000000006446")
                    .Where(l => l.UnitPrice == 10)
                    .Take(2)
                    .GroupBy(c => new
                    {
                        c.Version,
                        c.Currency,
                        c.ProductCode,
                        c.UnitPrice,
                        c.ProductDescription,
                        c.İnitiationResultCode,
                    })
                    .Select(g => new 
                    {
                        Version = g.Key.Version,
                        Currency = g.Key.Currency,
                        InitiationResultCode = g.Key.İnitiationResultCode,
                        ProductCode = g.Key.ProductCode,
                        ProductDescription = g.Key.ProductDescription,
                        TotalPrice = g.Sum(t => t.UnitPrice),

                    }))
...