我对使用Web服务中的C#RetrieveMultiple方法在CRM 2011中检索记录表示怀疑。
我需要根据属性值(主键)从实体中检索不同的记录。我可以通过使用下面的代码来实现这一目标
QueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1");
query.Distinct = true;
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
输出:
primarycolumn column1
xyz 1
lmn 2
显示不同的记录。但是,如果我向列集添加更多列,结果就不明显了。这显示在下面的代码中
QueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1", "column2");
query.Distinct = true;
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
输出:
primarycolumn column1 column2
xyz 1 a
xyz 1 b
lmn 2 a
我需要结果仅基于主列进行区分。
请帮助我了解如何实现这一目标。
实际上,代码是在C#中。下表显示了我正在查询的表
**Primary
column Column1 Column2 Column3<br/>**
Xyz Value1 Value1 Value1 <br/>
Xyz Value2 Value2 Value2<br/>
Lmn Value1 Value1 Value1<br/>
Lmn Value2 Value2 Value2<br/>
Xyz Value1 Value1 Value1<br/>
Lmn Value1 Value1 Value1<br/>
查询结果应如下所示。只有主列不同的值必须考虑,而所有其他列可以是不同的或不相同的。只应显示主列的不同值的任何一行。
(This is the output I am trying to achieve)<br/>
**Prmrycolumn Column1 Column2 Column3<br/>**
Xyz Value1 Value1 Value1<br/>
Lmn Value1 Value1 Value1<br/>
以下代码提供以下输出
QueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1");
query.Distinct = true;
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
**Primary column Column1**<br/>
Xyz Value1<br/>
Lmn Value1<br/>
但是当我向列集添加更多列时,输出也在考虑其他列的不同值
QueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1", "column2");
query.Distinct = true;
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
**Primary
column Column1 Column2 Column3<br/>**
Xyz Value1 Value1 Value1<br/>
Xyz Value2 Value2 Value2<br/>
Lmn Value1 Value1 Value1<br/>
Lmn Value2 Value2 Value2<br/>
通常,代码在C#中。下表显示了我正在查询的表
**Primary
column Column1 Column2 Column3<br/>**
Xyz Value1 Value1 Value1 <br/>
Xyz Value2 Value2 Value2<br/>
Lmn Value1 Value1 Value1<br/>
Lmn Value2 Value2 Value2<br/>
Xyz Value1 Value1 Value1<br/>
Lmn Value1 Value1 Value1<br/>
查询结果应如下所示。只有主列不同的值必须考虑,而所有其他列可以是不同的或不相同的。只应显示主列的不同值的任何一行。
(This is the output I am trying to achieve)<br/>
**Prmrycolumn Column1 Column2 Column3<br/>**
Xyz Value1 Value1 Value1<br/>
Lmn Value1 Value1 Value1<br/>
The below code gives the following output
QueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1");
query.Distinct = true;
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
**Primary column Column1**<br/>
Xyz Value1<br/>
Lmn Value1<br/>
但是当我向列集添加更多列时,输出也在考虑其他列的不同值
QueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1", "column2");
query.Distinct = true;
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
**Primary
column Column1 Column2 Column3<br/>**
Xyz Value1 Value1 Value1<br/>
Xyz Value2 Value2 Value2<br/>
Lmn Value1 Value1 Value1<br/>
Lmn Value2 Value2 Value2<br/>
答案 0 :(得分:4)
编辑答案:
我需要结果仅基于主列进行区分。
使用RetrieveMultiple服务调用无法满足上述要求。您基本上要求的是一种使用唯一主列检索每条记录的第一条记录的方法。这可能是使用生成的早期绑定实体实现的,但单独使用标准服务方法是不可能的。
要实现您的目标,您需要检索所有记录,这是您当前查询的作用:
ueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1", "column2");
query.Distinct = true; // this distinct will apply over all columns
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
收到此数据后,您需要过滤掉要忽略的所有记录。在您的情况下,您只需要找到第一条记录。您可以使用C#代码实现此目的,如下所示:
// this code filters out all records except the
// first for each unique primary column
var unique = result1.Entities.GroupBy(item => item.GetAttributeValue<Guid>("primarycolumn"))
.Select(item => item.First());