Dynamics 365 FetchXml Extentions

news/2024/10/17 20:31:41/

多年Dynamics CRM/365开发总结扩展的FetchXml组装辅助类,分享给关注我的小伙伴们,没有关注的也不要忘记成为关注我的小伙伴哦;

/* file name:lce.mscrm.engine.FetchXmlExt.cs
* author:lynx lynx.kor@163.com @ 2019/9/25 11:11:12
* copyright (c) 2019 Copyright@lynxce.com
* desc:
* > add description for FetchXmlExt
* revision:
*
*/using System.Collections.Generic;
using System.Linq;namespace lce.mscrm.engine
{/// <summary>/// action:FetchXmlExt/// </summary>public static class FetchXmlExt{/// <summary>/// 拼接XML/// </summary>/// <param name="entityName"></param>/// <param name="columns">   </param>/// <param name="conditions"></param>/// <param name="orders">    </param>/// <param name="page">      </param>/// <param name="size">      </param>/// <param name="filterType"></param>/// <returns>xml with fetch</returns>public static string FetchXml(string entityName, IList<string> columns, IList<ConditionItem> conditions = null, IList<OrderItem> orders = null, int page = 0, int size = 0, string filterType = "and"){return FetchXml(entityName, QueryColumns(entityName, columns), QueryFilter(conditions, filterType), QueryOrder(orders), "", page, size);}/// <summary>/// 拼接XML/// </summary>/// <param name="entityName"></param>/// <param name="columns">   fields split with ','</param>/// <param name="conditions"></param>/// <param name="orders">    </param>/// <param name="page">      </param>/// <param name="size">      </param>/// <param name="filterType"></param>/// <returns></returns>public static string FetchXml(string entityName, string columns, IList<ConditionItem> conditions = null, IList<OrderItem> orders = null, int page = 0, int size = 0, string filterType = "and"){return FetchXml(entityName, QueryColumns(entityName, columns), QueryFilter(conditions, filterType), QueryOrder(orders), "", page, size);}/// <summary>/// 拼接XML/// </summary>/// <param name="entityName"></param>/// <param name="columnsXml"></param>/// <param name="filterXml"> </param>/// <param name="ordersXml"> </param>/// <param name="linkXml">   </param>/// <param name="page">      </param>/// <param name="size">      </param>/// <returns></returns>public static string FetchXml(string entityName, string columnsXml, string filterXml = "", string ordersXml = "", string linkXml = "", int page = 0, int size = 0){if (string.IsNullOrEmpty(entityName)) return null;var header = "<fetch no-lock='true' version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>";if (0 != page && 0 != size){header = $"<fetch no-lock='true' returntotalrecordcount='true' distinct='false' {(page == 0 ? "" : $" page='{page}'")} {(size == 0 ? "" : $" count='{size}'")}>";}return
$@"{header}
<entity name='{entityName}'>
{columnsXml}
{ordersXml}
{linkXml}
{filterXml}
</entity>
</fetch>";}/// <summary>/// 拼接 Link Entity Xml/// </summary>/// <param name="linkEntity"></param>/// <param name="from">      </param>/// <param name="to">        </param>/// <param name="columnsXml"></param>/// <param name="filterXml"> </param>/// <param name="linkType">  outer or inner</param>/// <param name="alias">     default as alias_{linkEntity}</param>/// <param name="linkXml">   </param>/// <returns></returns>public static string LinkXml(string linkEntity, string from, string to, string columnsXml = "", string filterXml = "", string linkType = "outer", string alias = "", string linkXml = ""){return
$@"<link-entity name='{linkEntity}' from='{from}' to='{to}' link-type='{linkType}' alias='{(string.IsNullOrEmpty(alias) ? $"alias_{linkEntity}" : alias)}'>
{columnsXml}
{linkXml}
{filterXml}
</link-entity>";}/// <summary>/// 查询所有字段/// </summary>/// <returns></returns>public static string QueryAllColums(){return @"<all-attributes /><order attribute='createdon' descending='true' />";}/// <summary>/// 查询指定字段/// </summary>/// <param name="columns"></param>/// <returns></returns>public static string QueryColumns(IList<string> columns){if (null == columns || columns.Count == 0) return "";var result = "";foreach (var col in columns){result += $"<attribute name='{col.Trim()}' />";}return result;}/// <summary>/// 查询指定字段/// </summary>/// <param name="entityName"></param>/// <param name="columns">   </param>/// <param name="separator"> </param>/// <returns></returns>public static string QueryColumns(string entityName, string columns, char separator = ','){return QueryColumns(entityName, columns.Split(separator));}/// <summary>/// 查询指定字段/// </summary>/// <param name="entityName"></param>/// <param name="columns">   </param>/// <returns></returns>public static string QueryColumns(string entityName, IList<string> columns = null){if (!string.IsNullOrEmpty(entityName)){var pkCol = $@"{entityName}id";if (null == columns){columns = new string[] { pkCol };}else if (!columns.Contains(pkCol)){columns = columns.ToList();columns.Add(pkCol);}}return QueryColumns(columns);}/// <summary>/// 查询条件组装/// </summary>/// <param name="name">     </param>/// <param name="value">    </param>/// <param name="operators"></param>/// <returns></returns>public static string QueryCondition(string name, int value, string operators = "eq"){if (value < 0) return "";return new ConditionItem(name, value, operators).ToString();}/// <summary>/// 查询条件组装/// </summary>/// <param name="name">     </param>/// <param name="value">    </param>/// <param name="operators"></param>/// <returns></returns>public static string QueryCondition(string name, string value, string operators = "eq"){return new ConditionItem(name, value, operators).ToString();}/// <summary>/// 查询条件组装/// </summary>/// <param name="conditions"></param>/// <returns></returns>public static string QueryCondition(IList<ConditionItem> conditions){if (null == conditions || conditions.Count == 0) return "";var fetchCondition = "";foreach (var c in conditions){fetchCondition += c.ToString();}return fetchCondition;}/// <summary>/// 查询条件组装/// </summary>/// <param name="name">     </param>/// <param name="values">   </param>/// <param name="operators"></param>/// <returns></returns>public static string QueryCondition(string name, IList<int> values, string operators = "eq"){if (null == values || values.Count == 0) return "";return new ConditionItem(name, values, operators).ToString();}/// <summary>/// 查询条件组装/// </summary>/// <param name="name">     </param>/// <param name="values">   </param>/// <param name="operators"></param>/// <returns></returns>public static string QueryCondition(string name, IList<string> values, string operators = "eq"){if (null == values || values.Count == 0) return "";return new ConditionItem(name, values, operators).ToString();}/// <summary>/// 组装Filter/// </summary>/// <param name="name">     </param>/// <param name="value">    </param>/// <param name="operators"></param>/// <returns>xml with filter</returns>public static string QueryFilter(string name, object value, string operators = "eq"){return QueryFilter(new ConditionItem(name, value, operators));}/// <summary>/// 组装Filter/// </summary>/// <param name="conditions"> </param>/// <param name="type">       </param>/// <param name="childFilter"></param>/// <returns>xml with filter</returns>public static string QueryFilter(ConditionItem conditions, string type = "and", string childFilter = ""){return QueryFilter(new[] { conditions }, type, childFilter);}/// <summary>/// 组装Filter/// </summary>/// <param name="conditions"> </param>/// <param name="type">       </param>/// <param name="childFilter"></param>/// <returns>xml with filter</returns>public static string QueryFilter(IList<ConditionItem> conditions, string type = "and", string childFilter = ""){if (null == conditions || conditions.Count == 0) return "";return QueryFilter(QueryCondition(conditions), type, childFilter);}/// <summary>/// 组装Filter/// </summary>/// <param name="conditionXml"></param>/// <param name="type">        </param>/// <param name="childFilter"> </param>/// <returns>xml with filter</returns>public static string QueryFilter(string conditionXml, string type = "and", string childFilter = ""){return $@"<filter type='{type}'>{conditionXml}{childFilter}</filter>";}/// <summary>/// 排序条件组装/// </summary>/// <param name="orders"></param>/// <returns></returns>public static string QueryOrder(IList<OrderItem> orders){if (null == orders || orders.Count == 0) return "";var fetchOrder = "";foreach (var o in orders){fetchOrder += o.ToString();}return fetchOrder;}/// <summary>/// 排序条件组装/// </summary>/// <param name="attribute"> attribute</param>/// <param name="descending">is descending</param>/// <returns></returns>public static string QueryOrder(string attribute, bool descending = true){return new OrderItem(attribute, descending).ToString();}}/// <summary>/// 查询条件项/// </summary>public class ConditionItem{/// <summary>/// 实例化/// </summary>/// <param name="attr">     </param>/// <param name="value">    </param>/// <param name="_operator"></param>public ConditionItem(string attr, dynamic value, string _operator = "eq"){Attribute = attr;Value = value;Operator = _operator;}/// <summary>/// 字段名/// </summary>public string Attribute { get; set; }/// <summary>/// 运算符/// </summary>public string Operator { get; set; } = "eq";/// <summary>/// 字段值/// </summary>public dynamic Value { get; set; }/// <summary>/// </summary>/// <returns></returns>public override string ToString(){if (null == Value && Operator == "eq") return "";var type = Value.GetType();//var baseType = type.BaseType;if (type.Name == "Int32[]"){return ToString(((int[])Value).Select(x => x.ToString()).ToList());}else if (type.Name == "String[]"){return ToString(((string[])Value).Select(x => x.ToString()).ToList());}if (type.FullName.IndexOf("List") > 0){if (type.GenericTypeArguments[0].Name == "Int32"){return ToString(((List<int>)Value).Select(x => x.ToString()).ToList());}else if (type.GenericTypeArguments[0].Name == "String"){return ToString(((List<string>)Value).Select(x => x.ToString()).ToList());}else{return ToString(((List<object>)Value).Select(x => x.ToString()).ToList());}}else if (type.FullName.IndexOf("Array") > 0){return ToString(((object[])Value).Select(x => x.ToString()).ToList());}if (string.IsNullOrEmpty(Value.ToString()) && Operator == "eq") return "";return $"<condition attribute='{Attribute}' operator='{Operator}' {(string.IsNullOrEmpty(Value.ToString()) ? "" : $"value='{Value}'")} /> ";}private string ToString(IList<string> values){if (null == values || values.Count == 0) return "";if (values.Count > 1){if (Operator == "eq") Operator = "in";var vStr = "";foreach (var value in values){vStr += $"<value>{value}</value>";}return $"<condition attribute='{Attribute}' operator='{Operator}'>{vStr}</condition>";}if (Operator == "in") Operator = "eq";return $"<condition attribute='{Attribute}' operator='{Operator}' {(string.IsNullOrEmpty(values[0].ToString()) ? "" : $"value='{values[0]}'")} /> ";}}/// <summary>/// 排序项/// </summary>public class OrderItem{/// <summary>/// 实例化/// </summary>/// <param name="attr"></param>/// <param name="desc"></param>public OrderItem(string attr, bool desc = true){Attribute = attr;Descending = desc;}/// <summary>/// 字段名/// </summary>public string Attribute { get; set; }/// <summary>/// 是否倒序/// </summary>public bool Descending { get; set; } = true;/// <summary>/// </summary>/// <returns></returns>public override string ToString(){if (string.IsNullOrEmpty(Attribute)) return "";return $@"<order attribute='{Attribute}' descending='{Descending.ToString().ToLower()}' />";}}
}

觉得有用就给点个赞,点个关注,感谢支持 


http://www.ppmy.cn/news/349517.html

相关文章

Flex下载与安装

下载地址一&#xff1a; http://download.macromedia.com/pub/flex/flex_builder/FB3_win.exe 大小&#xff1a; 424 MB &#xff1b;未进行压缩的 Flex Builder 3 安装文件 不用注册登录&#xff0c;可以直接下载。 Flex builder 3.0注册码&#xff08;已经试过的&#xff0c;…

Microsoft 365 for Mac(原Office 365)

Office 365是微软推出的一款云端办公套件&#xff0c;包括Word、Excel、PowerPoint、Outlook等多个应用程序&#xff0c;提供了丰富的功能和工具&#xff0c;可以更高效地完成各种文档处理、数据分析、演示制作和邮件管理等任务。Office 365还支持多设备同步&#xff0c;可以随…

Dynamics 365 FO 集成Office 2016

在Excel中&#xff0c;Microsoft Dynamics Office加载项允许用户从Microsoft Dynamics系统读取&#xff0c;分析和编辑数据&#xff0c;并将数据更改发布回Microsoft Dynamics OData服务 在Word中&#xff0c;Microsoft Dynamics Office加载项允许用户设计文档模板&#xff0c;…

Office 365系列(-)

昨天参加上海微软TechED技术大会&#xff0c;看见很多传说中的大牛&#xff0c;听了涂曙光老师等人的讲座&#xff0c;激情澎湃啊&#xff0c;看见他们对技术以及程序员社区的投入及激情&#xff0c;十分敬佩。自己搞IT行业也已经10多年了&#xff0c;平常都很少写博客和分享之…

office365离线安装

office版本是在线安装&#xff0c;每次安装比较麻烦&#xff0c;所以还是离线安装合适&#xff0c;这里推荐一篇博文https://www.cnblogs.com/Devopser/p/7919245.html 但是由于部署工具变化更新&#xff0c;有时候可能还是要折腾一下。所以我把该工具解压出来&#xff0c;直接…

mx53 camera s5k5bbgx驱动分析

一&#xff1a; linux驱动层 1. 通讯方式I2C驱动注册&#xff1a; a&#xff1a; arch/arm/mach-mx5/mx53_xx.c /* 声明s5k5bbgx的IIC 资源 */ static int mxc_camera2_pwdn(int pwdn) {if (pwdn)gpio_direction_output(MX53_HMS_CAMERA2_PWN, 1);elsegpio_direction_o…

Office 2010安装时缺少MSXML 6.10.1129.0

一、下载MSXML6组件 官方下载 二、安装组件 根据电脑系统位数&#xff08;32位即x86、64位即x64&#xff09;&#xff0c;安装对应的MSXML6组件。 三、注册组件 用WINR组合键调出运行&#xff08;或&#xff1a;左下角“开始”菜单→运行…&#xff09;注意先后顺序 第一次…

安装MS office2010 提示安装msxml6.0.....

问题描述 安装Office2010时&#xff0c;提示需要在计算机上安装MSXML版本6.10.1129.0 解决方法 下载msxml6安装文件http://download.csdn.net/detail/gnail_oug/9501320 &#xff0c;内含32位和64位也可以直接在微软下载中心下载msxml6&#xff0c;下载地址 安装好之后&#…