[英]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.