2014-02-13 4 views
2

Я пытаюсь получить имена всех полей схемы сущности без запроса к существующей записи. Я понятия не имею.Как получить все поля объекта CRM 2011?

Также, как я могу получить его с помощью QueryExpression, заставить его получить все поля, содержащие некоторую информацию?

Андрий, я пытаюсь сделать что-то вроде этого

var query = new QueryExpression {EntityName = "", ColumnSet = new ColumnSet(true)}; 
var retrieve = service.RetrieveMultiple(query); 
+1

Для чего нужна эта информация? Ответ Андрея правильный, если вы хотите метаданные объекта, и ответ woogy работает, если вы хотите получить имена полей без запроса CRM. – Daryl

+0

Daryl, мне нужно получить все имена полей этого объекта, но этот метод не получает полей, значение которых равно null. – ernikoss

+0

Мне нужно получить все имена полей в реальном времени, чтобы сделать список с флажками с ними. – ernikoss

ответ

4

Если у вас есть SDK CRM (http://www.microsoft.com/en-us/download/details.aspx?id=24004), вы найдете утилиту под названием «Crmsvcutil.exe» в папке SDK \ Bin. Этот исполняемый файл будет генерировать классы, которые представляют каждый из ваших CRM-объектов и их полей. Затем вы можете использовать метод type.GetFields() для получения полей этих классов в вашем коде. После того, как вы создали эти классы с помощью crmsvcutil, вы можете использовать запросы LINQ для запроса своих CRM-данных на основе любых критериев, которые соответствуют вашим потребностям, включая ненулевые поля. Вопрос вы будете сталкиваться с попытками использовать QueryExpression в том, что вы должны определить поля вручную, как показано ниже:

QueryExpression query = new QueryExpression("contact"); 
query.ColumnSet.AddColumns("firstname", "lastname"); 
query.Criteria.AddFilter(filter1); 
+0

woogy, я, вероятно, создаю эти классы, но я не могу их использовать, потому что поля могут создавать позже. – ernikoss

+0

Это правильно. Чтобы решить эту проблему, я сохранил команду crmsvcutil, которая генерирует эти классы, и я могу повторно запустить, когда мне нужно синхронизировать классы с изменениями полей в CRM. –

+0

woogy, есть коммерческий проект для продажи. Я не думаю, что клиент будет делать это в будущем :) – ernikoss

2

Вы должны попытаться использовать RetrieveEntity message, чтобы получить все поля сущностей. Вы не сможете получить поле, если оно равно нулю. Вам придется проанализировать - если атрибут внутри коллекции - он содержит значение, в противном случае он равен нулю.

+0

Andrii, разве нет способа получить их? – ernikoss

+0

Боюсь, что нет. –

4

Я искал что-то подобное и в конечном итоге приготовления пищи полезный метод как таковой:

/// <summary> 
/// Retrieves an entity's attributes. 
/// </summary> 
/// <param name="entityName">entity's name</param> 
/// <param name="languageId">return display names of such language code</param> 
/// <param name="xrm">xrmservicecontext object</param> 
/// <returns>Dictionary<string, string></returns> 
public static Dictionary<string, string> GetAttributes(string entityName, int languageId, XrmServiceContext xrm) 
{ 
    Dictionary<string, string> attributesData = new Dictionary<string, string>(); 

    RetrieveEntityRequest metaDataRequest = new RetrieveEntityRequest(); 
    RetrieveEntityResponse metaDataResponse = new RetrieveEntityResponse(); 
    metaDataRequest.EntityFilters = EntityFilters.Attributes; 
    metaDataRequest.LogicalName = entityName; 
    metaDataResponse = (RetrieveEntityResponse)xrm.Execute(metaDataRequest); 

    foreach (AttributeMetadata a in metaDataResponse.EntityMetadata.Attributes) 
    { 
     //if more than one label for said attribute, get the one matching the languade code we want... 
     if (a.DisplayName.LocalizedLabels.Count() > 1) 
      attributesData.Add(a.LogicalName, a.DisplayName.LocalizedLabels.Where(x=>x.LanguageCode == languageId).SingleOrDefault().Label); 

     //else, get the only one available regardless of languade code... 
     if (a.DisplayName.LocalizedLabels.Count() == 1) 
      attributesData.Add(a.LogicalName, a.DisplayName.LocalizedLabels[0].Label); 
    } 

     return attributesData; 
} 

Вы можете, конечно, изменить его, чтобы возвращать всю необходимую информацию об атрибутах сущности, но я в своем случае искал способ заменить логическое имя атрибутов, которые использует CRM SDK для автоматического создания столбца gridview с фактическим отображать имя атрибутов.

Смежные вопросы