使用Microsoft CRM 2011中的查询表达式检索不同的记录

时间:2011-12-07 12:37:48

标签: distinct record dynamics-crm-2011

我对使用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/>

1 个答案:

答案 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());