簡體   English   中英

如何根據 LINQ 中的另一個字段動態字段 select?

[英]How to select dynamically fields according to some another field in LINQ?

我的項目中有CloudCredential表。 在表中,我有 4 種類型(LIBVIRT、AWS、OPENSTACK、AZURE)(枚舉)和每種類型的不同大小的字段。 表結構看起來像

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

問題是我想根據雲類型 select,如果雲類型 = 2(OPENSTACK)還有 select 字段(openStackUser、openStackProject 等)是否可以在 Z999429482F0840718 中包含 if 語句

PS CloudType 是動態的,它根據項目名稱而變化,我需要 select 中的多個 if 邏輯。

“我如何在 select 中使用 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);
}

您可以編寫返回正確數據的 function。

你可以嘗試類似的東西,但我還沒有測試過。

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

我不贊成混合不同的類型。 我會創建不同的函數來接收不同的 object 類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM