X++:
protected void Page_Load(object sender, EventArgs e)
{
const string DOMAIN = "...";
const string USER = "...";
const string PASS = "...";
const string ORG_NAME = "...";
const string CRM_SERVER_URL = "http://.../" + ORG_NAME;
var eventId = new Guid("044220DB-1230-DE11-9DEE-00304894FA2D");
const string EVENT_ENTITY_NAME = "new_event";
const string ATTR_NAME = "new_startdate";
var eventColumns = new ColumnSet(new[] { ATTR_NAME });
var query = new QueryExpression("new_event") { ColumnSet = eventColumns, Criteria = new FilterExpression { FilterOperator = LogicalOperator.And } };
var condition = new ConditionExpression("new_eventid", ConditionOperator.Equal, new object[] { eventId });
query.Criteria.Conditions.Add(condition);
var queryString = @"
<fetch mapping='logical' version='1.0'>
<entity name='new_event'>
<attribute name='new_startdate' />
<filter>
<condition attribute='new_eventid' operator='eq' value='" + eventId + @"' />
</filter>
</entity>
</fetch>";
DateTime date;
using (var service = CreateDllCrmService(CRM_SERVER_URL, ORG_NAME, DOMAIN, USER, PASS))
{
var @event = service.Retrieve(EVENT_ENTITY_NAME, eventId, eventColumns);
date = @event.GetAttributeValue<DateTime>(ATTR_NAME);
var events = service.RetrieveMultiple(query);
date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);
events = service.RetrieveMultiple(new FetchExpression(queryString));
date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);
}
{
var client = CreateOrganizationServiceClient(DOMAIN, USER, PASS);
var @event = client.Retrieve(EVENT_ENTITY_NAME, eventId, eventColumns);
date = @event.GetAttributeValue<DateTime>(ATTR_NAME);
var events = client.RetrieveMultiple(query);
date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);
events = client.RetrieveMultiple(new FetchExpression(queryString));
date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);
client.Close();
}
{
var context = CreateOrganizationDataServiceContext(CRM_SERVER_URL, ORG_NAME, DOMAIN, USER, PASS);
var events = (from evt in context.New_EventSet where evt.New_EventId == eventId select evt).ToArray();
date = events[0].New_StartDate.Value;
}
}
private OrganizationServiceProxy CreateDllCrmService(string crmServerUrl, string orgName, string domain, string user, string pass)
{
var serverAndOrgName = crmServerUrl.EndsWith(orgName) ? crmServerUrl : crmServerUrl + "/" + orgName;
var orgServiceUri = new Uri(serverAndOrgName + "/XRMServices/2011/Organization.svc");
var orgConfiguration = ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(orgServiceUri);
var credentials = new ClientCredentials();
credentials.Windows.ClientCredential = new NetworkCredential(user, pass, domain);
return new OrganizationServiceProxy(orgConfiguration, credentials);
}
private OrganizationServiceClient CreateOrganizationServiceClient(string domain, string user, string pass)
{
var client = new OrganizationServiceClient();
client.ClientCredentials.UserName.UserName = domain + @"\" + user;
client.ClientCredentials.UserName.Password = pass;
return client;
}
private atcContext CreateOrganizationDataServiceContext(string crmServerUrl, string orgName, string domain, string user, string pass)
{
var serverAndOrgName = crmServerUrl.EndsWith(orgName) ? crmServerUrl : crmServerUrl + "/" + orgName;
var context = new atcContext(new Uri(String.Format("{0}/xrmservices/2011/organizationdata.svc/",
serverAndOrgName), UriKind.Absolute)) { Credentials = new NetworkCredential(user, pass, domain) };
return context;
}
Собственно я испробовал все возможные варианты получения данных. Радует что результат одинаковый во всех случаях, но почему он именно такой?
Во всех случаях возвращается дата в UTC, о чем говорит свойство Kind даты, а также сверка с тем, что реально храниться в SQL.