gpt4 book ai didi

c# - CRM 2011 - 拦截快速搜索、获取 xml 和查询表达式不返回相同的东西?

转载 作者:行者123 更新时间:2023-11-30 15:06:01 30 4
gpt4 key购买 nike

我正在从某些实体的快速搜索框中创建搜索快捷方式。这是为了避免多次返回,尤其是当名称可能包含城市名称时。 (城市搜索是相关的,所以它必须留下来)

我通过一个插件来完成这个。所以用户输入

/name Todd Richardson

在联系人实体 View 的搜索框中。

更新

这会拦截(预操作阶段:20 预验证阶段:10)联系人的 Retrievemultiple 请求。

结束更新

更新 这里要求的是从 MSCRM 2011 sdk 工具生成然后修改的实现的开始 请记住,此代码处于原型(prototype)状态,可能不适合生产代码:

protected void ExecutePreAccountRetrieveMultiple(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}

if (localContext.PluginExecutionContext.InputParameters.Contains("Query"))
{
if (localContext.PluginExecutionContext.InputParameters["Query"] is QueryExpression)
{
//query expression from input is assigned to a local variable for modification.
QueryExpression qe = (QueryExpression)localContext.PluginExecutionContext.InputParameters["Query"];

if (qe.Criteria != null)
{
if (qe.Criteria.Filters.Count > 1)
{
string entitySubject = qe.EntityName;
string searchSubject = qe.Criteria.Filters[1].Conditions[0].Values[0].ToString();


string namePattern = @"^([/\\-])+N(AME)?:?[\s]*(.+$)";

//.... Eliminated for brevity, only including branch thats relevant to this question.


if (Regex.IsMatch(searchSubject.TrimEnd("%".ToCharArray()), namePattern, RegexOptions.IgnoreCase))
{
var Match = Regex.Match(searchSubject.TrimEnd("%".ToCharArray()), namePattern, RegexOptions.IgnoreCase);


if (Match.Groups.Count > 1)
{
int lastIndex = Match.Groups.Count - 1;
string name = Match.Groups.Cast<Group>().Last().Value;
Func<string, List<ConditionExpression>> genXpress = (n) =>
{

List<ConditionExpression> ce = new List<ConditionExpression>();

foreach (var val in name.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(x => string.Format("%{0}%", x)))
{
ce.Add(new ConditionExpression
{
Operator = ConditionOperator.Like,
AttributeName = n,
Values = { val }
});
}
return ce;
};

if (entitySubject == "contact")
{

string[] names = name.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
if (names.Length > 1)
{
string fn = names[names.Length - 2];
string ln = names[names.Length - 1];

string fetchRequest =
@"<?xml version=""1.0""?>
<fetch distinct=""false"" mapping=""logical"" output-format=""xml-platform"" version=""1.0"">
<entity name=""contact""> <attribute name=""fullname""/>
<attribute name=""telephone1""/> <attribute name=""contactid""/>
<order descending=""false"" attribute=""fullname""/>
<filter type=""and"">
<filter type=""or"">
<filter type=""and"">
<condition attribute=""lastname"" value=""%%lastname%%"" operator=""like""/>
<condition attribute=""firstname"" value=""%%firstname%%"" operator=""like""/>
</filter>
<filter type=""and"">
<condition attribute=""lastname"" value=""%%firstname%%"" operator=""like""/>
<condition attribute=""firstname"" value=""%%lastname%%"" operator=""like""/>
</filter>
</filter>
</filter>
</entity>
</fetch>" //

.Replace("%lastname%", ln).Replace("%firstname%", fn);


var conversionRequest = new FetchXmlToQueryExpressionRequest
{
FetchXml = fetchRequest
};
var response = (FetchXmlToQueryExpressionResponse)localContext.OrganizationService.Execute(conversionRequest);

localContext.PluginExecutionContext.OutputParameters["Query"] = response.Query;
return;
}
//variable modified and now passed out for execution.
localContext.PluginExecutionContext.OutputParameters["Query"] = qe;


return;
}
}
} //Remainder of code eliminated for different logic branches.

结束更新

生成查询表达式并将其放入名为查询的输出参数中。

最初我正在构建 QueryExpression。我发现这不起作用。无论我如何构建查询表达式,我都会得到

condition1 || condition 2 || condition3 || condition4 

所以我换了个角度。我转到“高级”查找并创建了一个查询,该查询完全返回了我在结果中想要的内容。我下载了 fetch-xml,现在这就是我所拥有的(如前面的代码所示):

string fetchRequest =
@"<?xml version=""1.0""?>
<fetch distinct=""false"" mapping=""logical"" output-format=""xml-platform"" version=""1.0"">
<entity name=""contact""> <attribute name=""fullname""/>
<attribute name=""telephone1""/> <attribute name=""contactid""/>
<order descending=""false"" attribute=""fullname""/>
<filter type=""and"">
<filter type=""or"">
<filter type=""and"">
<condition attribute=""lastname"" value=""%%lastname%%"" operator=""like""/>
<condition attribute=""firstname"" value=""%%firstname%%"" operator=""like""/>
</filter>
<filter type=""and"">
<condition attribute=""lastname"" value=""%%firstname%%"" operator=""like""/>
<condition attribute=""firstname"" value=""%%lastname%%"" operator=""like""/>
</filter>
</filter>
</filter>
</entity>
</fetch>" //

无论我是在代码中生成 Queryexpression,还是从组织服务中获取它,似乎都得到了相同的结果。而不是

(condition1 && condition2) || (condition3 && condition4) 

满足条件,基本就结束了

condition1 || condition2 || condition3 || condition4 

我尝试了获取 xml 的其他变体,包括:

string fetchRequest =  @"<?xml version=""1.0""?>
<fetch distinct=""false"" mapping=""logical"" output-format=""xml-platform"" version=""1.0"">
<entity name=""contact""> <attribute name=""fullname""/>
<attribute name=""telephone1""/> <attribute name=""contactid""/>
<order descending=""false"" attribute=""fullname""/>
<filter type=""and"">
<condition attribute=""lastname"" value=""%%lastname%%"" operator=""like""/>
<condition attribute=""firstname"" value=""%%firstname%%"" operator=""like""/>
</filter>
</entity>
</fetch>"

这又是

condition1 || condition2

不是

condition1 && condition2

任何人都知道发生了什么事。我应该使用不同的 fetchxml 吗?这是一个错误吗?在一天的大部分时间里,答案一直在躲避我。

希望这只是我忽略的简单事情。

最佳答案

您正在将修改后的查询添加到 OutputParameters 集合。这是不正确的; CRM 事件管道不希望查询参数出现在该集合中,因此将其忽略。这就是您看不到所需结果集的原因。

您必须将 InputParameters 集合中的现有查询参数替换为您修改的参数。

关于c# - CRM 2011 - 拦截快速搜索、获取 xml 和查询表达式不返回相同的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408685/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com