Basic Dictionary string values can be pulled but ContainsKey checks aren't performed.

main
Sean McArde 2024-04-23 13:26:40 -07:00
parent a4a2b12db4
commit e6389cab1d
2 changed files with 11 additions and 8 deletions

View File

@ -1,4 +1,5 @@
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
@ -62,13 +63,15 @@ namespace McRule.Tests {
}
[Test] public void CanSelectDictionaryValuesByKey() {
[Test]
public void CanSelectDictionaryValuesByKey() {
var lambda = itPeople.GetPredicateExpression<ContextStringDictionary>();
Console.WriteLine(lambda);
var filter = lambda.Compile();
Func<ContextStringDictionary, bool> filterText = x => (x.ContainsKey("Department") && (x["Department"] != null) && x["Department"].Equals("IT"));
var filteredContexts = SomeContexts.Select(x => x.Context).Where(filterText)?.ToList();
var filteredContexts = SomeContexts.Select(x => x.Context)
.Where(x => x.ContainsKey("Department")) // Skip entry with a missing key
.Where(filter)?.ToList();
Assert.NotNull(filteredContexts);
Assert.AreEqual(filteredContexts.Count, 2);

View File

@ -402,20 +402,20 @@ public abstract class ExpressionGeneratorBase : ExpressionGenerator {
if (value.StartsWith("*") && value.EndsWith("*"))
{
comparison = PredicateBuilder.And<T>((Expression<Func<T, bool>>)comparison, AddStringPropertyExpression<T>(strParam, value.Trim('*'), "Contains", ignoreCase));
comparison = AddStringPropertyExpression<T>(strParam, value.Trim('*'), "Contains", ignoreCase);
}
else if (value.StartsWith("*"))
{
comparison = PredicateBuilder.And<T>((Expression<Func<T, bool>>)comparison, AddStringPropertyExpression<T>(strParam, value.TrimStart('*'), "EndsWith", ignoreCase));
comparison = AddStringPropertyExpression<T>(strParam, value.TrimStart('*'), "EndsWith", ignoreCase);
}
else if (value.EndsWith("*"))
{
comparison = PredicateBuilder.And<T>((Expression<Func<T, bool>>)comparison, AddStringPropertyExpression<T>(strParam, value.TrimEnd('*'), "StartsWith", ignoreCase));
comparison = AddStringPropertyExpression<T>(strParam, value.TrimEnd('*'), "StartsWith", ignoreCase);
}
else
{
comparison = PredicateBuilder.And<T>((Expression<Func<T, bool>>)comparison, AddStringPropertyExpression<T>(strParam, value, "Equals", ignoreCase));
comparison = AddStringPropertyExpression<T>(strParam, value, "Equals", ignoreCase);
}
if (negateResult)