Выделить все поля из сущности CDS
В SDK для общих служб данных Microsoft.CommonDataService
Я могу выбрать объекты из БД с этим кодом
// Specify the generic object to retrieve
var genericEntitySet = client.GetRelationalEntitySet(
new EntitySetReference("Microsoft.CommonDataService.CommonEntities",
AdvEntity.EntityName,
Microsoft.CommonDataService.Version.Create("1.0.0")));
// Specify the required fields
var query = genericEntitySet.CreateQueryBuilder()
.Project(pc =>
pc
.SelectField(f => f["PrimaryId"])
.SelectField(f => f["Project_Title"])
.SelectField(f => f["CreatedByUser"])
.SelectField(f => f["CreatedOnDateTime"])
.SelectField(f => f["LastModifiedByUser"])
.SelectField(f => f["LastModifiedDateTime"])
.SelectField(f => f["Opportuinity"])
.SelectField(f => f["BNB"])
.SelectField(f => f["SP_URL"])
.SelectField(f => f["ProjectMgr"])
.SelectField(f => f["WorkTeam"])
.SelectField(f => f["BnB_ID"])
.SelectField(f => f["Custodian"])
.SelectField(f => f["Stage"])
.SelectField(f => f["Opp_Status"])
.SelectField(f => f["Confidential"])
.SelectField(f => f["CRMT_Num"])
.SelectField(f => f["Proj_Num"])
.SelectField(f => f["Sector"])
.SelectField(f => f["Service"])
.SelectField(f => f["Archive"])
);
var selectExecutor = client.CreateRelationalBatchExecuter(
RelationalBatchExecutionMode.Transactional);
await selectExecutor
.Query(query, out OperationResult<IReadOnlyList<RelationalEntity>> queryResult)
.ExecuteAsync();
Однако кажется трудным выбрать все эти поля для каждого типа объекта, который мне может понадобиться.
Есть ли способ просто сказать коду, чтобы получить все свойства?
В документации говорится, что
Обратите внимание, что по соображениям производительности нет возможности автоматически выбирать все поля.
Этот SDK находится в предварительном просмотре, и поэтому о нем не так много информации, но, возможно, кто-то знает хитрость для этого?
1 ответ
Краткая история: CDS 1.0, о которой вы говорите, - это старая версия, построенная на основе Dynamics AX, теперь вышла из употребления.
Совершенно новый CDS 2.0, построенный на основе Dynamics CRM, также называемый Dynamics 365 для взаимодействия с клиентами, называемый CDS для приложений. Этот CDS для приложений имеет такие понятия запросов, как QueryExpression и FetchXML, где вы можете указать все атрибуты (ColumnSet = new ColumnSet(true)
) для получения так же, как SQL (select * from table
)
var request = new RetrieveRequest()
{
ColumnSet = new ColumnSet(true),
RelatedEntitiesQuery = relationshipQueryCollection,
Target = new EntityReference("account", accountid)
};
Тем не менее, это не рекомендуется с точки зрения производительности.
Согласно документации...
static async Task SimpleSelectAsync(Client client)
{
var queryBuilder = client.GetRelationalEntitySet<ProductCategory>()
.CreateQueryBuilder();
var query = queryBuilder
.Where(pc => pc.Name == "Electronics")
.OrderByAscending(pc => new object[] { pc.CategoryId })
.Project( /* REMOVE THIS STUFF?.. pc => pc.SelectField(f => f.CategoryId)
.SelectField(f => f.Name)
.SelectField(f => f.Description) */ );
// Execute the query:
OperationResult<IReadOnlyList<ProductCategory>> queryResult = null;
var executor = client.CreateRelationalBatchExecuter(
RelationalBatchExecutionMode.Transactional)
.Query(query, out queryResult);
await executor.ExecuteAsync();
foreach (var pc in queryResult.Result)
{
Console.WriteLine(pc.Name);
}
}