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

Pal*_*abu 0 record distinct 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);
Run Code Online (Sandbox Code Playgroud)

输出:

primarycolumn  column1
xyz            1
lmn            2 
Run Code Online (Sandbox Code Playgroud)

这会显示不同的记录。但是,如果我向列集中添加更多列,则结果并不明显。这如下面的代码所示

QueryExpression query = new QueryExpression("entityname");
query.ColumnSet.AddColumns("primarycolumn", "column1", "column2");
query.Distinct = true;
EntityCollection result1 = serviceProxy.RetrieveMultiple(query);
Run Code Online (Sandbox Code Playgroud)

输出:

primarycolumn  column1 column2 
xyz            1        a        
xyz            1        b 
lmn            2        a
Run Code Online (Sandbox Code Playgroud)

我需要结果仅根据主列而不同。

请帮助我如何实现这一目标。


  • 有关上述问题的更多信息。

实际上,代码是用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/>
Run Code Online (Sandbox Code Playgroud)

查询结果应该如下所示。其中只有主列必须考虑不同值,所有其他列可以是不同的或不不同的。只应显示主列的不同值的任何一行。

(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/>
Run Code Online (Sandbox Code Playgroud)

下面的代码给出以下输出

     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/>
Run Code Online (Sandbox Code Playgroud)

但是当我向列集中添加更多列时,输出也会考虑其他列的不同值

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/>
Run Code Online (Sandbox Code Playgroud)

实际上,代码是用 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/>
Run Code Online (Sandbox Code Playgroud)

查询结果应该如下所示。其中只有主列必须考虑不同值,所有其他列可以是不同的或不不同的。只应显示主列的不同值的任何一行。

(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/>
Run Code Online (Sandbox Code Playgroud)

但是当我向列集中添加更多列时,输出也会考虑其他列的不同值

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/>
Run Code Online (Sandbox Code Playgroud)

Luk*_*lch 5

编辑后的答案:

我需要结果仅根据主列而不同。

使用 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);
Run Code Online (Sandbox Code Playgroud)

收到此数据后,您将需要过滤掉所有要忽略的记录。就您而言,您只想要找到的第一条记录。您可以使用 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());
Run Code Online (Sandbox Code Playgroud)