C# CRM FetchXml,如何动态添加匹配相关实体的quicksearch筛选器';她叫什么名字?

C# CRM FetchXml,如何动态添加匹配相关实体的quicksearch筛选器';她叫什么名字?,c#,dynamics-crm-2011,fetchxml,C#,Dynamics Crm 2011,Fetchxml,我在CRM之外有一个网页,允许用户执行CRM查找。我需要像在普通的CRM UI中一样使用快速搜索来实现对查找结果的过滤 我获取所选实体/视图的FetchXML,然后获取所选实体的快速搜索视图的FetchXML,提取isquickfindfields=1的筛选器节点,将{0}替换为他们在搜索框中键入的内容,将修改后的节点插入所选视图的FetchXML,然后执行它 我遇到的问题是,一些快速搜索过滤器针对的是相关实体的id字段,但匹配需要针对该实体的主名称属性 例如,下面是对account实体的快速搜

我在CRM之外有一个网页,允许用户执行CRM查找。我需要像在普通的CRM UI中一样使用快速搜索来实现对查找结果的过滤

我获取所选实体/视图的FetchXML,然后获取所选实体的快速搜索视图的FetchXML,提取isquickfindfields=1的筛选器节点,将{0}替换为他们在搜索框中键入的内容,将修改后的节点插入所选视图的FetchXML,然后执行它

我遇到的问题是,一些快速搜索过滤器针对的是相关实体的id字段,但匹配需要针对该实体的主名称属性

例如,下面是对account实体的快速搜索:


添加quicksearch筛选器的(整个方法的):

if(string.IsNullOrWhiteSpace(searchString)=false)
{
var quickSearch=CRMCache.SavedQueries.FirstOrDefault(q=>q.ReturnedTypeCode==view.ReturnedTypeCode&&q.QueryType==SavedQueryQueryType.QuickFindSearch);
if(快速搜索!=null)
{
var quickSearchXml=XElement.Parse(quickSearch.FetchXml);
var quickSearchFilter=quickSearchXml.XPathSelectElement(“//过滤器[@isquickfindfields=1]”);
foreach(quickSearchFilter.Elements(“条件”)中的var条件)
{
condition.SetAttributeValue(“value”,string.Format(condition.Attribute(“value”).value,“%”+searchString+“%”);
}
添加(quickSearchFilter);
}
}
虽然我很好奇普通的CRM UI是如何处理这个问题的,但我的问题是如何在查找/视图上动态应用快速搜索过滤,以正确过滤相关实体的主名称属性


[编辑以澄清]

快速搜索(或快速查找)是CRM中的一种视图类型。它定义用户在“快速搜索”框中输入文本或过滤查找时搜索的属性。所有实体都有一个快速搜索视图,一个实体只能有一个

匹配相关实体名称的要求来自“快速搜索”视图。并不是所有的实体引用都包含过滤器,但当它包含过滤器时,我需要匹配名称而不是guid。因为普通的CRM UI正确地将搜索字符串应用于相关实体的名称,即使快速搜索视图的FetchXML具有针对id的过滤器,我认为CRM在内部处理了这种情况。显然,情况并非如此(我得到的错误表明了这一点)。所以我需要检测这个案例并做一些不同的事情,我想动态地这样做

所谓动态,我的意思是我的代码没有一堆预定义的FetchXML字符串;它没有针对特定实体、视图或搜索要求进行编码;而且它不需要每次添加或更改新实体或视图时都进行修改。在这种情况下,“动态”可能不是一个好词,但我不知道还能叫它什么。实体/视图不可知

我不想要这样的代码:

SearchResults ExecuteView(string entityLogicalName,string searchString)
{
开关(entityLogicalName)
{
案例“账户”:
返回searchAccounts(searchString);
…所有其他实体。。。
违约:
抛出新异常(“未知实体类型:+entityLogicalName”);
}
}
SearchResults searchAccounts(searchString)
{
var fetchXml=string.Format(@)
“,搜索字符串);
返回executeSearch(fetchXml);
}

因为CRM中的更改(添加/删除实体、添加/删除/更新视图)需要更新代码以匹配。

我希望我理解您的问题。primarycontactid不是一个名称,而是一个表示记录的guid,在本例中是一个联系人。除非用户知道每个记录的guid,否则搜索此字段毫无意义。但您希望在联系人内部进行搜索,因此必须进行链接(相当于sql中的join),请参见此处如何使用FetchXml和链接实体示例:

下面是您想做的一个示例:


在C#中动态执行FetchXML:

string fetchrequest=string.Format(
@"
,queueid.ToString());
字符串fetchresult=crmservice.Fetch(fetchrequest);
XmlDocument document=新的XmlDocument();
document.LoadXml(fetchresult);
Writeline(“元素编号:+document.SelectSingleNode(//resultset/result/c”).InnerText));

我希望我理解了你的问题。primarycontactid不是一个名称,而是一个表示记录的guid,在本例中是一个联系人。除非用户知道每个记录的guid,否则搜索此字段毫无意义。但您希望在联系人内部进行搜索,因此必须进行链接(相当于sql中的join),请参见此处如何使用FetchXml和链接实体示例:

下面是您想做的一个示例:


在C#中动态执行FetchXML:

string fetchrequest=string.Format(
@"
,queueid.ToString());
字符串fetchresult=crmservice.Fetch(fetchrequest);
XmlDocument document=新的XmlDocument();
document.LoadXml(fetchresult);
Writeline(“元素编号:+document.SelectSingleNode(//resultset/result/c”).InnerText));

我不知道CRM是如何利用字符串搜索guid的,但我怀疑它执行了一些预处理或后端操作,而您可能无法使用这些操作。(我想如果你真的想知道,你可以尝试反编译CRM.dll,但那可能需要一段时间)

因此,作为替代方案
An exception System.FormatException was thrown while trying to convert input value '%acme%' to attribute 'account.primarycontactid'. Expected type of attribute value: System.Guid. Exception raised: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).