多年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()}' />";
}
}
}
觉得有用就给点个赞,点个关注,感谢支持