8000 Correctly translating FetchXml with multiple filter nodes by BetimBeja · Pull Request #507 · jordimontana82/fake-xrm-easy · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository was archived by the owner on Jun 16, 2024. It is now read-only.

Correctly translating FetchXml with multiple filter nodes #507

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions FakeXrmEasy.Shared/Extensions/XmlExtensionsForFetchXml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -216,12 +216,19 @@ public static bool ToReturnTotalRecordCount(this XDocument xlDoc)

public static FilterExpression ToCriteria(this XDocument xlDoc, XrmFakedContext ctx)
{
return xlDoc.Elements() //fetch
var filters = xlDoc.Elements() //fetch
.Elements() //entity
.Elements() //child nodes of entity
.Where(el => el.Name.LocalName.Equals("filter"))
.Select(el => el.ToFilterExpression(ctx))
.FirstOrDefault();
.Select(el => el.ToFilterExpression(ctx));

if (filters.Count() > 1)
{
var result = new FilterExpression(LogicalOperator.And);
result.Filters.AddRange(filters);
return result;
}
return filters.FirstOrDefault();
}

public static string GetAssociatedEntityNameForConditionExpression(this XElement el)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3053,5 +3053,46 @@ public void FetchXml_Operator_Next_X_Years_Execution()
var retrievedUser = collection.Entities[0].Id;
Assert.Equal(retrievedUser, ct1.Id);
}

[Fact]
public void FetchXml_Operator_Multiple_Filter_Execution()
{
var ctx = new XrmFakedContext();
ctx.ProxyTypesAssembly = Assembly.GetAssembly(typeof(Contact));

var fetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='contact'>
<attribute name='fullname' />
<attribute name='telephone1' />
<order attribute='fullname' descending='false' />
<filter type='and'>
<condition attribute='telephone1' operator='eq' value='123' />
</filter>
<filter type='or'>
<condition attribute='telephone1' operator='neq' value='321' />
</filter>
</entity>
</fetch>";

var query = XrmFakedContext.TranslateFetchXmlToQueryExpression(ctx, fetchXml);

Assert.True(query.Criteria != null);
Assert.Equal(2, query.Criteria.Filters.Count);
Assert.Equal("telephone1", query.Criteria.Filters[0].Conditions[0].AttributeName);
Assert.Equal(ConditionOperator.Equal, query.Criteria.Filters[0].Conditions[0].Operator);
Assert.Equal(ConditionOperator.NotEqual, query.Criteria.Filters[1].Conditions[0].Operator);

var ct1 = new Contact() { Id = Guid.NewGuid(), Telephone1 = "123" }; //Should be returned
var ct2 = new Contact() { Id = Guid.NewGuid(), Telephone1 = "321" }; //Shouldnt
var ct3 = new Contact() { Id = Guid.NewGuid(), Telephone1 = "000" }; //Shouldnt
ctx.Initialize(new[] { ct1, ct2, ct3 });
var service = ctx.GetOrganizationService();

var collection = service.RetrieveMultiple(new FetchExpression(fetchXml));

Assert.Single(collection.Entities);
var retrievedUser = collection.Entities[0].Id;
Assert.Equal(retrievedUser, ct1.Id);
}
}
}
0