Как динамически выбирать поля в соответствии с другим полем в LINQ? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть CloudCredential таблица в моем проекте. В таблице у меня есть 4 типа (LIBVIRT, AWS, OPENSTACK, AZURE) (enum) и разные размеры полей для каждого из них. Структура таблицы выглядит как

 {
        "id": 1,
        "cloudType": 2,
        "name": "CedricOpenstack",
        "organization": null,
        "organizationId": 1,
        "azureSubscriptionId": null,
        "azureClientId": null,
        "azureClientSecret": null,
        "azureTenantId": null,
        "openStackUser": "xxxx",
        "openStackPassword": "xxx",
        "openStackUrl": "xxx",
        "openStackProject": "xxx",
        "openStackDomain": "default",
        "openStackRegion": "RegionOne",
        "openStackPublicNetwork": "public",
        "openStackImportNetwork": false,
        "awsSecretAccessKey": null,
        "awsAccessKeyId": null,
        "awsDefaultRegion": null,
        "projects": []
    },

У меня есть такой метод.

         [HttpGet]
         public async Task<IActionResult> GetLibvirtCredentials([FromQuery]string 
          projectName)
         {
             var result = await (from project in _context.Projects
                 join cloud in _context.CloudCredentials on project.CloudCredentialId equals 
                 cloud.Id
                 where project.Name == projectName
                 select new
                 {
                     CloudName = cloud.Name,
                     CloudType = cloud.CloudType.ToString("G"),
                     OrganizationName = cloud.Organization.Name,
                     ProjectName = project.Name
                 }).ToListAsync();

             return Ok(result);
         }

Проблема в том, что я хотел бы выбрать в соответствии с типом облака, если тип облака = 2 (OPENSTACK) также выберите поля, подходящие для этого (openStackUser, openStackProject и т. д. c.) Возможно ли включить оператор if внутри select.

PS CloudType - это Dynami c, который изменяется в соответствии с projectName, и мне нужно несколько, если logi c внутри выбора.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

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

Вы можете попробовать что-то вроде, но я не проверял это.

[HttpGet]
public async Task<IActionResult> GetLibvirtCredentials([FromQuery]string projectName)
{
    var result = await (from project in _context.Projects
                        join cloud in _context.CloudCredentials on project.CloudCredentialId equals
                        cloud.Id
                        where project.Name == projectName
                        select SelectData(project)).ToListAsync();

    return Ok(result);
}

private object SelectData(TypeOfProject project)
{
    switch (project.CloudType)
    {
        case 1:

            return new
            {
                CloudName = project.Name,
                CloudType = project.CloudType.ToString("G"),
                OrganizationName = project.Organization.Name,
                ProjectName = project.Name,
                OpenStackUser = project.openStackUser,
                OpenStackPassword = project.openStackPassword
            };


        case 2:
            return new
            {
                CloudName = project.Name,
                CloudType = project.CloudType.ToString("G"),
                OrganizationName = project.Organization.Name,
                ProjectName = project.Name,
                AzureSubscriptionId = project.azureSubscriptionId,
                AzureClientId = project.azureClientId
            };


        default:
            throw new NotSupportedException();
    }
}

I Я не за смешивание разных типов. Я бы создал разные функции для получения разных типов объектов.

0 голосов
/ 20 апреля 2020

"как я могу использовать foreach внутри выберите" вы не можете. Запрос будет переведен в SQL -команду, поэтому все, что вы делаете в запросе, должно быть представлено некоторой SQL -командой.

Но вы можете просто запросить все проекты и затем решить, какие данные следует перенаправить

[HttpGet]
public async Task<IActionResult> GetLibvirtCredentials([FromQuery]string 
projectName)
{
    var result = await (from project in _context.Projects
        join cloud in _context.CloudCredentials on project.CloudCredentialId equals 
        cloud.Id
        where project.Name == projectName
        select new
        {
            CloudName = cloud.Name,
            CloudType = cloud.CloudType.ToString("G"),
            OrganizationName = cloud.Organization.Name,
            Project = project
        }).ToListAsync();

    var actualResult = result
        .Select(data => {
            switch (data.CloudType) {
                // deciding on the cloud type which fields should be forwareded
            }
        });

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