Skip to content

Commit

Permalink
Merge pull request #3 from MscrmTools/v2
Browse files Browse the repository at this point in the history
V2
  • Loading branch information
MscrmTools authored Dec 8, 2022
2 parents 52aee35 + 4cf404e commit e10509e
Show file tree
Hide file tree
Showing 14 changed files with 13,869 additions and 6,553 deletions.
3,279 changes: 2,167 additions & 1,112 deletions MscrmTools.FluentQueryExpressions.Test/FilterTest.cs

Large diffs are not rendered by default.

2,517 changes: 1,281 additions & 1,236 deletions MscrmTools.FluentQueryExpressions.Test/LinkTest.cs

Large diffs are not rendered by default.

4,065 changes: 2,362 additions & 1,703 deletions MscrmTools.FluentQueryExpressions.Test/QueryExpressionTest.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\MscrmTools.FluentQueryExpressions.v8.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
Expand All @@ -29,6 +30,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\MscrmTools.FluentQueryExpressions.v8.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>true</SignAssembly>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@
// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
// en utilisant '*', comme indiqué ci-dessous :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.5.0.0")]
[assembly: AssemblyFileVersion("1.5.0.0")]
[assembly: AssemblyVersion("2.0.0")]
[assembly: AssemblyFileVersion("2.0.0")]
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<DefineConstants>TRACE;DEBUG;CRMV9</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\MscrmTools.FluentQueryExpressions.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
Expand All @@ -30,6 +31,7 @@
<DefineConstants>TRACE;CRMV9</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\MscrmTools.FluentQueryExpressions.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>true</SignAssembly>
Expand Down
4 changes: 2 additions & 2 deletions MscrmTools.FluentQueryExpressions/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@
// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
// en utilisant '*', comme indiqué ci-dessous :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.6.0.0")]
[assembly: AssemblyFileVersion("1.6.0.0")]
[assembly: AssemblyVersion("2.0.0")]
[assembly: AssemblyFileVersion("2.0.0")]
243 changes: 210 additions & 33 deletions MscrmTools.Shared/AppCode/Comparer.cs
Original file line number Diff line number Diff line change
@@ -1,92 +1,269 @@
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using MscrmTools.FluentQueryExpressions;
using MscrmTools.FluentQueryExpressions.Helpers;
using System;
using System.Linq.Expressions;

namespace MscrmTools.Shared.AppCode
{
public class Comparer<T>
/// <summary>
/// A class to start a column comparison in Dataverse
/// </summary>
/// <typeparam name="T"><see cref="Query"/>, <see cref="Link"/> or <see cref="Filter"/></typeparam>
public class Comparer<T> : Comparer<T, Entity>
{
/// <summary>
/// Initializes a new instance of the <see cref="Comparer{T}"/> class.
/// </summary>
/// <param name="parent">The parent.</param>
/// <param name="column">First column to compare.</param>
public Comparer(T parent, string column) : base(parent, column)
{
}

/// <summary>
/// Initializes a new instance of the <see cref="Comparer{T}"/> class.
/// </summary>
/// <param name="parent">The parent.</param>
/// <param name="tableAlias">Alias of the related table.</param>
/// <param name="column">First column to compare.</param>
public Comparer(T parent, string tableAlias, string column) : base(parent, tableAlias, column)
{
}
}

/// <summary>
/// A class to start a column comparison in Dataverse
/// </summary>
/// <typeparam name="T">Query, Link or Filter</typeparam>
/// <typeparam name="U">Strongly typed Dataverse table class</typeparam>
public class Comparer<T, U> where U : Entity
{
/// <summary>
/// The parent (<see cref="Query"/>, <see cref="Link"/> or <see cref="Filter"/>)
/// </summary>
private readonly T _parent;

public Comparer(T parent, string attributeName)
/// <summary>
/// Initializes a new instance of the <see cref="Comparer{T, U}"/> class.
/// </summary>
/// <param name="parent">The parent.</param>
/// <param name="column">First column to compare.</param>
public Comparer(T parent, string column)
{
_parent = parent;

AttributeName = attributeName;
Column = column;
}

public Comparer(T parent, string entityName, string attributeName)
/// <summary>
/// Initializes a new instance of the <see cref="Comparer{T, U}"/> class.
/// </summary>
/// <param name="parent">The parent.</param>
/// <param name="tableAlias">Alias of the related table.</param>
/// <param name="column">First column to compare.</param>
public Comparer(T parent, string tableAlias, string column)
{
_parent = parent;

AttributeName = attributeName;
EntityName = entityName;
Column = column;
TableAlias = tableAlias;
}

internal string AttributeName { get; set; }
internal string EntityName { get; set; }
/// <summary>
/// Gets or sets the column.
/// </summary>
/// <value>
/// The column.
/// </value>
internal string Column { get; set; }

/// <summary>
/// Gets or sets the table alias.
/// </summary>
/// <value>
/// The table alias.
/// </value>
internal string TableAlias { get; set; }

#if CRMV9

public T Equal(string attributeName)
/// <summary>
/// First column value is equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T Equal(string column)
{
var ce = new ConditionExpression(Column, ConditionOperator.Equal, true, column);
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

/// <summary>
/// First column value is equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T Equal(Expression<Func<U, object>> column)
{
var ce = new ConditionExpression(AttributeName, ConditionOperator.Equal, true, attributeName);
if (!string.IsNullOrEmpty(EntityName)) ce.EntityName = EntityName;
var ce = new ConditionExpression(Column, ConditionOperator.Equal, true, AnonymousTypeHelper.GetAttributeName(column));
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

public T NotEqual(string attributeName)
/// <summary>
/// First column value is not equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T NotEqual(string column)
{
var ce = new ConditionExpression(AttributeName, ConditionOperator.NotEqual, true, attributeName);
if (!string.IsNullOrEmpty(EntityName)) ce.EntityName = EntityName;
var ce = new ConditionExpression(Column, ConditionOperator.NotEqual, true, column);
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

public T GreaterThan(string attributeName)
/// <summary>
/// First column value is not equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T NotEqual(Expression<Func<U, object>> column)
{
var ce = new ConditionExpression(AttributeName, ConditionOperator.GreaterThan, true, attributeName);
if (!string.IsNullOrEmpty(EntityName)) ce.EntityName = EntityName;
var ce = new ConditionExpression(Column, ConditionOperator.NotEqual, true, AnonymousTypeHelper.GetAttributeName(column));
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

public T GreaterOrEqualThan(string attributeName)
/// <summary>
/// First column value is greater than <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T GreaterThan(string column)
{
var ce = new ConditionExpression(AttributeName, ConditionOperator.GreaterEqual, true, attributeName);
if (!string.IsNullOrEmpty(EntityName)) ce.EntityName = EntityName;
var ce = new ConditionExpression(Column, ConditionOperator.GreaterThan, true, column);
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

public T LessThan(string attributeName)
/// <summary>
/// First column value is greater than <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T GreaterThan(Expression<Func<U, object>> column)
{
var ce = new ConditionExpression(AttributeName, ConditionOperator.LessThan, true, attributeName);
if (!string.IsNullOrEmpty(EntityName)) ce.EntityName = EntityName;
var ce = new ConditionExpression(Column, ConditionOperator.GreaterThan, true, AnonymousTypeHelper.GetAttributeName(column));
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

public T LessOrEqualThan(string attributeName)
/// <summary>
/// First column value is greater or equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T GreaterOrEqualThan(string column)
{
var ce = new ConditionExpression(AttributeName, ConditionOperator.LessEqual, true, attributeName);
if (!string.IsNullOrEmpty(EntityName)) ce.EntityName = EntityName;
var ce = new ConditionExpression(Column, ConditionOperator.GreaterEqual, true, column);
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

/// <summary>
/// First column value is greater or equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T GreaterOrEqualThan(Expression<Func<U, object>> column)
{
var ce = new ConditionExpression(Column, ConditionOperator.GreaterEqual, true, AnonymousTypeHelper.GetAttributeName(column));
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

/// <summary>
/// First column value is less than <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T LessThan(string column)
{
var ce = new ConditionExpression(Column, ConditionOperator.LessThan, true, column);
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

/// <summary>
/// First column value is less than <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T LessThan(Expression<Func<U, object>> column)
{
var ce = new ConditionExpression(Column, ConditionOperator.LessThan, true, AnonymousTypeHelper.GetAttributeName(column));
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

/// <summary>
/// First column value is less or equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T LessOrEqualThan(string column)
{
var ce = new ConditionExpression(Column, ConditionOperator.LessEqual, true, column);
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

/// <summary>
/// First column value is less or equal to <paramref name="column"/> value
/// </summary>
/// <param name="column">Second column to compare</param>
/// <returns><typeparamref name="T"/> instance</returns>
public T LessOrEqualThan(Expression<Func<U, object>> column)
{
var ce = new ConditionExpression(Column, ConditionOperator.LessEqual, true, AnonymousTypeHelper.GetAttributeName(column));
if (!string.IsNullOrEmpty(TableAlias)) ce.EntityName = TableAlias;

return AddCondition(ce);
}

/// <summary>
/// Add the condition in the parent object
/// </summary>
/// <param name="ce">the <see cref="ConditionExpression"/></param>
/// <returns><typeparamref name="T"/> instance</returns>
private T AddCondition(ConditionExpression ce)
{
if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Query<>)
|| typeof(T) == typeof(Query))
if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Query<>) || typeof(T) == typeof(Query))
{
((dynamic)_parent).QueryExpression.Criteria.AddCondition(ce);
}
else if (typeof(T) == typeof(Filter))
((Filter)(object)_parent).InnerFilter.AddCondition(ce);
else if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Link<>)
|| typeof(T) == typeof(Link))
else if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Filter<>) || typeof(T) == typeof(Filter))
{
((dynamic)_parent).InnerFilter.AddCondition(ce);
}
else
{
((dynamic)_parent).InnerLinkEntity.LinkCriteria.AddCondition(ce);
}

return _parent;
}
Expand Down
10 changes: 10 additions & 0 deletions MscrmTools.Shared/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,18 @@

namespace MscrmTools.FluentQueryExpressions
{
/// <summary>
/// Extensions for the Dataverse <see cref="IOrganizationService"/>
/// </summary>
public static class Extensions
{
/// <summary>
/// Retrieves multiple records from a fluent query.
/// </summary>
/// <typeparam name="T">Strongly typed Dataverse table</typeparam>
/// <param name="service">The Dataverse service.</param>
/// <param name="query">The fluent query.</param>
/// <returns>A list of <typeparamref name="T"/> records</returns>
public static List<T> RetrieveMultiple<T>(this IOrganizationService service, Query<T> query) where T : Entity
{
return query.GetAll(service);
Expand Down
Loading

0 comments on commit e10509e

Please sign in to comment.