2016-11-29 85 views
0

我需要从CRM entity查询一些值,其中linked entity在其name内包含stringC#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包含的记录哪个名字包含一个string我通过了一个city哪个名字包含另一个string我通过。

我知道这段代码适用于检索所有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;   

但我真的不知道如何使用这段代码来实现我的目标。我不知道如何过滤entityreference的entityreference。

任何帮助将不胜感激

+0

把这个新的LinkEntity(new_supplycontract.EntityLogicalName,“new_comune “,”new_city“,”new_comuneid“,JoinOperator.Inner);在一个新的变量。然后,您可以按照与查询相同的方式将链接实体添加到该变量。这就是你如何链接他们。 – Lidaranis

回答

1

LinkedEntities可以嵌套在CRM 2011 LinkedEntities这是改变自2013年起在那里引入的实体名称属性,有没有需要一种具有嵌套实体。

但基本上,您可以从supplycontract实体开始,然后添加一个链接的实体对您的new_pod实体。从该链接实体中,您需要添加2个链接实体,一个链接到new_city实体,另一个链接到new_street实体。这两个链接实体中的每一个都需要一个包含条件表达式,您可以在其中传递要用于过滤的2个字符串。

例:现在

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

btw,只是为了知道,我知道linQ“like”操作符不适用于CRM,几周前我尝试过但没有任何成功,有没有办法让它工作? –

+0

你试过了.Contains(“string”)?或者.StartsWith(“string”)或.EndsWith(“string”)。 .Contains可能会打破索引,从性能的角度来看,真的很糟糕,除非使用FULL TEXT索引 – Jordi

1

我遇到过无数与LINQ to CRM有关的问题,主要是由于我误解了它的工作原理。不幸的是,查询表达式非常冗长且难以阅读。我创建并使用DLaB.Xrm库,使我的生活更简单(多类型化,我爱我一些EarlyBound开发)

这里使用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()