2016-11-29 2 views
0

Мне нужно запросить у CRM entity некоторые значения, где linked entity содержит string внутри его name.C# crm linQ LinkEntities

Я пытаюсь объяснить:

  • У меня есть new_supplycontract стол.
  • Эта таблица, имеет EntityReference имени new_pod
  • В new_pod сущности, имеет два поля: new_citypod и new_street
  • new_citypod указывает на другой организации под названием new_city
  • new_street очков другому лицу по имени new_street

Мне нужно запросить таблицу new_supplycontract, чтобы получить только записи, new_pod содержит street какое имя содержит string I pass и city какое имя содержит другое string i pass.

Я знаю, что этот код работает для извлечения всех объектов new_supplycontract, чьи два текстовых поля «new_city» и «new_address» похожи на две переданные строки.

QueryExpression query = new QueryExpression(new_supplycontract.EntityLogicalName); 
query.ColumnSet = new ColumnSet(true); 
query.Criteria.AddCondition("new_city", ConditionOperator.NotNull); 
query.Criteria.AddCondition("new_address", ConditionOperator.NotNull); 

query.LinkEntities.Add(new LinkEntity(new_supplycontract.EntityLogicalName, "new_comune", "new_city", "new_comuneid", JoinOperator.Inner)); 
query.LinkEntities[0].Columns.AddColumns("new_name"); 
query.LinkEntities[0].EntityAlias = "comuneTemp"; 
query.LinkEntities[0].LinkCriteria.AddCondition("new_name", ConditionOperator.Like, "%" + comune + "%"); 

query.LinkEntities.Add(new LinkEntity(new_supplycontract.EntityLogicalName, new_via.EntityLogicalName, "new_address", "new_viaid", JoinOperator.Inner)); 
query.LinkEntities[1].Columns.AddColumns("new_name"); 
query.LinkEntities[1].EntityAlias = "viaTemp"; 
query.LinkEntities[1].LinkCriteria.AddCondition("new_name", ConditionOperator.Like, "%" + via + "%"); 


DataCollection<Entity> entities = service.RetrieveMultiple(query).Entities;   

Но я действительно не знаю, как использовать этот код для моей цели. Я не знаю, как отфильтровать привязку сущности объекта.

Любая помощь будет оценена

+0

поставить этот: новый LinkEntity (new_supplycontract.EntityLogicalName, «new_comune "," new_city "," new_comuneid ", JoinOperator.Inner); в новой переменной. Затем вы можете добавить объект привязки к этой переменной так же, как и здесь, с запросом. Вот как вы их связываете. – Lidaranis

ответ

1

LinkedEntities могут быть вложены LinkedEntities в CRM 2011. Это было изменено с 2013 года, когда был введен атрибут EntityName и не было необходимость иметь вложенные объекты.

Но в принципе, вы можете начать с объекта supplycontract, а затем добавить связанный объект против вашего объекта new_pod. Из этого связанного объекта вам нужно будет добавить 2 связанных объекта, один из которых будет привязан к объекту new_city, а другой - к объекту new_street. Каждому из этих двух связанных объектов потребуется выражение условия contains, в котором вы передаете 2 строки, которые вы хотите использовать для фильтрации.

Ex:

QueryExpression query = new QueryExpression(new_supplycontract.EntityLogicalName); 
query.ColumnSet = new ColumnSet(true); 
var le = query.LinkEntities.Add(new LinkEntity(new_pod.EntityLogicalName, "new_pod", "new_pod", "new_podid", JoinOperator.Inner)); 

var lePod = le.LinkEntities.Add(new LinkEntity(new_pod.EntityLogicalName, "new_city", "new_citypod", "new_cityid", JoinOperator.Inner)); 
var leCity = le.LinkEntities.Add(new LinkEntity(new_pod.EntityLogicalName, "new_street", "new_street", "new_streetid", JoinOperator.Inner)); 

//Add conditions to each nested linked entity now as above. 

Теперь, я лично предпочитаю LINQ вызвать запрос гораздо легче читать, чем при использовании LinkedEntities.

Надеюсь, это поможет.

+0

Спасибо за ответ! просто вопрос: вы использовали 'var le = ..', но' linkEntities.Add' является 'void'. После использования 'le.Linkentities.add ...', но я должен использовать везде 'query.linkedentities.add ...,' вместо этого, правильно? –

+0

Кстати, просто чтобы знать, я знал, что с linQ оператор «как» не работал на CRM, я пробовал его несколько недель назад, но без каких-либо успехов, есть ли способ заставить его работать? –

+0

Вы пытались. Содержит («строка»)? Или в качестве альтернативы .StartsWith ("string") или .EndsWith ("string"). .Contains может сломать индекс и быть очень плохим с точки зрения производительности, если только не использовать индексы FULL TEXT – Jordi

1

Я столкнулся с бесчисленными проблемами с LINQ to CRM, в основном из-за моего непонимания, как это работает. К сожалению, Query Expressions чрезвычайно подробны и трудно читаются. Я создал и использовать библиотеку DLaB.Xrm, чтобы сделать свою жизнь проще (и более типизированной, я люблю мне EarlyBound Dev)

Вот ваш запрос с использованием DLaB.Xrm:

var qe = QueryExpressionFactory.Create<new_supplycontract>(); 
var podLink = qe.AddLink<new_pod>(new_supplycontract.Fields.new_Pod, new_pod.Fields.Id); 

podLink.AddLink<new_city>(new_pod.Fields.new_citypod,    // This is the attribute of the "from" entity to join on 
          new_city.Fields.Id,      // This is the attribute of the "to" entity to join on. If name is identical, this parameter can be removed 
          new ColumnSet(new_city.Fields.new_name)) // AliasedValue to add to the result 
    .LinkCriteria.AddCondition("new_name", ConditionOperator.Like, "%" + comune + "%"); 

podLink.AddLink<new_street>(new_pod.Fields.new_street, 
          new_street.Fields.Id, 
          ColumnSet(new_street.Fields.new_name)) 
    .LinkCriteria.AddCondition("new_name", ConditionOperator.Like, "%" + via + "%"); 

var leads = service.GetEntities(qe); 
+0

Это фантастика! просто вопрос, пытаясь установить пакет nuget, дает мне ошибку: не удалось установить пакет «DLaB.Common 1.0.1.13». Вы пытаетесь установить этот пакет в проект, который нацелен на «.NETFramework, Version = v4.5», но пакет не содержит ссылок на сборки или файлов содержимого, которые совместимы с этой инфраструктурой. Я могу установить версию 1.0.0, но все остальные версии дают мне эту ошибку, я что-то пропустил? –

+0

@PierGiorgioMisley Думаю, вам нужно настроить таргетинг на 4.5.2. – Daryl

+0

нет способов для 4.5? не может установить 4.5.2 на серверы :( –

0

Вы должны цепями объекты связи.Вот пример:

 ConditionExpression condition3 = new ConditionExpression(); 
     ... 
     LinkEntity link3 = new LinkEntity(); 
     ... 
     link3.LinkCriteria.Conditions.Add(condition3); 

     ConditionExpression condition2 = new ConditionExpression(); 
     ... 
     LinkEntity link2 = new LinkEntity(); 
     ... 
     link2.LinkCriteria.Conditions.Add(condition2); 

     LinkEntity link1 = new LinkEntity(); 
     ... 
     link1.LinkEntities.Add(link2); 
     link1.LinkEntities.Add(link3); 

     QueryExpression query = new QueryExpression(""); 
     ... 
     query.LinkEntities.Add(link1); 

     DataCollection<Entity> entities = service.RetrieveMultiple(query).Entities; 

Это помогает писать их отдельно и использовать .Criteria.Conditions.Add() вместо .Criteria.AddCondition()

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