내가 .NET Framework의 특정 SDK에 있어요, 나 데이터 저장소에 대한 식을 작성하고 나에게 결과를 반환 할 수 있습니다 (이 질문에 그러나 중요하지, CRM SDK
단지 배경). 여기서 키은 쿼리 이 실제로 실행될 때 쿼리가 실행될 때 묻는 에 의존한다는 것입니다.이니셜 라이저에 객체 인스턴스를 설정하고 즉시 속성에 액세스하는 방법은 무엇입니까?
그래서 6000 개 항목이 식을 실행하는 경우는 모든 120 열과 모든 레코드를 반환하는 데 5 분 정도 걸릴 수 있습니다. 그러나 5-6 개의 필드/열에 대해서만 요청하면 6000 개의 모든 항목을 반환하는 데 5-10 초 정도 걸릴 수 있습니다. 여기에서 중요한 키는 객체 이니셜 라이저에서 모든 필드에 대해 묻는 필드가 SDK에서 실행되는 쿼리에 영향을 미친다는 것입니다.
EntityReference
내 object initializer
에있는 속성에 액세스하는 중 문제가 발생하여 즉시 1 통화에서 속성에 액세스합니다. 설명 할 몇 가지 코드 - 아래의 문제 코드. 또한입니다 반환 된 데이터가 작은 있도록 쿼리 실행 만, 3 곳을 요구하기 때문에 매우 빠른 :
var results = allAccountsQuery.Select(account => new Account
{
AccountNo = account.GetAttributeValue<string>("AccountNumber"),
//AccountID NOT working!
AccountID = new EntityReference() { Id = account.GetAttributeValue<EntityReference>("AccountID").Id }.Id,
Name = account.GetAttributeValue<string>("AccountName")
}).ToList();
기분을 상하게하는 라인은 다음과 같다 : 당신이 볼 수 있듯이
AccountID = new EntityReference() { Id = account.GetAttributeValue<EntityReference>("AccountID").Id }.Id
, 난 을 시도하여 EntityReference
의 인스턴스를 인스턴스화하고 초기화 한 다음 즉시 백 엔드의 속성에 액세스합니다. Object reference not set to an instance of an object
다음 코드는 작동하지만 매우 비효율적 인 이유는 모두가이되기 때문입니다. SDK는 object initiazlizer
에 요청 된 필드를 기반으로 쿼리를 평가하기 위해서만 마술을 일부 수행합니다. 이 경우 쿼리가되고있는 평가하고 루프의 첫번째 반복에서 다시 모든을 제공하지만, 작동 :
List<Account> allAccounts = new List<Account>();
//Super slow - framework actually gets back ALL accounts in 1st iteration
foreach (var account in allAccountsQuery)
{
Account newAccount = new Account
{
AccountNo = account.GetAttributeValue<string>("AccountNumber"),
Name = account.GetAttributeValue<string>("AccountName")
};
//WORKS: This separate instantiation and then accessing of the property works!!
//Note it is done in 2 steps outside the object initializer
//Need to see if I can do this in an object initializer instead of separately
EntityReference ef = account.GetAttributeValue<EntityReference>("AccountID");
newAccount.AccountID = ef.Id;
allAccounts.Add(newAccount);
}
그래서 질문은 내가 EntityReference
인스턴스를 지시하고 추출 할 수있는 방법은 재산 Id
입니다 객체 이니셜 라이저에서 내 결과 평가 쿼리가 작습니까? 내가 한 이제
//Anonymous type collection
var accounts = allAccountsQuery.Select(account => new
{
AccountNo = account.GetAttributeValue<string>("AccountNumber"),
AccountID = account.GetAttributeValue<EntityReference>("AccountID"),
Name = account.GetAttributeValue<string>("AccountName")
}).ToList();
:
nullref가 전달되는 이유는 무엇입니까? 그것은 전체 이니셜 라이저 일 수도 있고 단순히이 부분 일 수도 있습니다 :'account.GetAttributeValue ("AccountID"). Id'. 먼저 확인하십시오. –
정의 된 코드를 제거하면 코드가 작동하고'results' 컬렉션이 채워지기 때문에 그 라인입니다. 그것이 문제가되는 재산입니다. – atconway
그 줄에서'NullReference'를 얻는다면'foreach' 루프에서도 예외가 발생합니다, 그렇습니까? –