public void Nullable()
    {
        var list = new List <TargetWithNullable>
        {
            new TargetWithNullable
            {
                Field = null
            },
            new TargetWithNullable
            {
                Field = 10
            }
        };

        var resultFromString = list
                               .Where(FuncBuilder <TargetWithNullable> .BuildPredicate("Field", Comparison.Equal, new[] { "10" }))
                               .Single();

        Assert.Equal(10, resultFromString.Field);
        var nullResult = list
                         .Where(FuncBuilder <TargetWithNullable> .BuildPredicate("Field", Comparison.Equal, null))
                         .Single();

        Assert.Null(nullResult.Field);
    }
    static IEnumerable <TItem> ApplyToAll <TItem>(this IEnumerable <TItem> items, Func <Type, string, object> getArguments)
    {
        if (ArgumentReader.TryReadId(getArguments, out var values))
        {
            var predicate = FuncBuilder <TItem> .BuildPredicate("Id", Comparison.In, values);

            items = items.Where(predicate);
        }

        foreach (var where in ArgumentReader.ReadWhere(getArguments))
        {
            var predicate = FuncBuilder <TItem> .BuildPredicate(where);

            items = items.Where(predicate);
        }

        items = Order(items, getArguments);

        if (ArgumentReader.TryReadSkip(getArguments, out var skip))
        {
            items = items.Skip(skip);
        }

        if (ArgumentReader.TryReadTake(getArguments, out var take))
        {
            items = items.Take(take);
        }

        return(items);
    }
    public void Nullable_requiring_parse()
    {
        var guid = Guid.Parse("00000000-0000-0000-0000-000000000001");
        var list = new List <TargetWithNullableRequiringParse>
        {
            new TargetWithNullableRequiringParse
            {
                Field = null
            },
            new TargetWithNullableRequiringParse
            {
                Field = guid
            }
        };

        var resultFromString = list
                               .Where(FuncBuilder <TargetWithNullableRequiringParse> .BuildPredicate("Field", Comparison.Equal, new[] { guid.ToString() }))
                               .Single();

        Assert.Equal(guid, resultFromString.Field);
        var nullResult = list
                         .Where(FuncBuilder <TargetWithNullableRequiringParse> .BuildPredicate("Field", Comparison.Equal, null))
                         .Single();

        Assert.Null(nullResult.Field);
    }
    public void Field()
    {
        var list = new List <TargetWithField>
        {
            new TargetWithField
            {
                Field = "Target1"
            },
            new TargetWithField
            {
                Field = "Target2"
            }
        };

        var result = list
                     .Where(FuncBuilder <TargetWithField> .BuildPredicate("Field", Comparison.Equal, new[] { "Target2" }))
                     .Single();

        Assert.Equal("Target2", result.Field);
    }
    public void NotInGuidList()
    {
        var list = new List <TargetForInGuid>
        {
            new TargetForInGuid
            {
                Member = Guid.Parse("00000000-0000-0000-0000-000000000001")
            },
            new TargetForInGuid
            {
                Member = Guid.Parse("00000000-0000-0000-0000-000000000002")
            }
        };

        var result = list
                     .Where(FuncBuilder <TargetForInGuid> .BuildPredicate("Member", Comparison.NotIn, new[] { "00000000-0000-0000-0000-000000000002" }))
                     .Single();

        Assert.Same(list[0], result);
    }
    public void NotInList()
    {
        var list = new List <TargetForIn>
        {
            new TargetForIn
            {
                Member = "Value1"
            },
            new TargetForIn
            {
                Member = "Value2"
            }
        };

        var result = list
                     .Where(FuncBuilder <TargetForIn> .BuildPredicate("Member", Comparison.NotIn, new[] { "Value2" }))
                     .Single();

        Assert.Equal("Value1", result.Member);
    }
    public void Nested()
    {
        var list = new List <Target>
        {
            new Target
            {
                Member = "a"
            },
            new Target
            {
                Member = "bb"
            }
        };

        var result = list
                     .Where(FuncBuilder <Target> .BuildPredicate("Member.Length", Comparison.Equal, new[] { "2" }))
                     .Single();

        Assert.Equal("bb", result.Member);
    }
    public void NotInIntList()
    {
        var list = new List <TargetForInInt>
        {
            new TargetForInInt
            {
                Member = 1
            },
            new TargetForInInt
            {
                Member = 2
            }
        };

        var result = list
                     .Where(FuncBuilder <TargetForInInt> .BuildPredicate("Member", Comparison.NotIn, new[] { "2" }))
                     .Single();

        Assert.Equal(1, result.Member);
    }
    public void Combos(string name, Comparison expression, string value, string expectedName, StringComparison?stringComparison)
    {
        var people = new List <Person>
        {
            new Person
            {
                Name        = "Person 1",
                Age         = 12,
                DateOfBirth = new DateTime(2001, 10, 10, 10, 10, 10, DateTimeKind.Utc)
            },
            new Person
            {
                Name        = "Person 2",
                Age         = 13,
                DateOfBirth = new DateTime(2000, 10, 10, 10, 10, 10, DateTimeKind.Utc)
            }
        };

        var result = people
                     .Where(FuncBuilder <Person> .BuildPredicate(name, expression, new[] { value }, stringComparison))
                     .Single();

        Assert.Equal(expectedName, result.Name);
    }