Closed neilbgr closed 6 months ago
If adding this condition after the else, my case is fixed but 2 unit tests failed...
From System.Linq.Dynamic.Core\Parser\SupportedMethods\MethodFinder.cs
line 132:
for (var i = 0; i < args.Length; i++)
{
if (args[i].Type != methodData.Args[i].Type &&
args[i].Type.IsArray && methodData.Args[i].Type.IsArray &&
args[i].Type != typeof(string) && methodData.Args[i].Type == typeof(object[]))
{
args[i] = _expressionHelper.ConvertAnyArrayToObjectArray(args[i]);
}
else if (methodData.Args[i].Type != typeof(object)) // Fix (or hack?)
{
args[i] = methodData.Args[i];
}
}
My unit test (in file test\System.Linq.Dynamic.Core.Tests\QueryableTests.UseParameterizedNamesInDynamicQuery.cs
):
public void Issue775()
{
var list = new List<Customer>
{
new()
{
CustomerID = 1,
Name = "Duffy",
GenderType = Gender.Female
},
new()
{
CustomerID = 2,
Name = "Garry",
GenderType = Gender.Male
},
new()
{
CustomerID = 3,
Name = "John",
GenderType = Gender.Male
}
};
var config = new ParsingConfig
{
UseParameterizedNamesInDynamicQuery = true
};
var subquery = list.AsQueryable().Where(_ => _.CustomerID == 2);
//var subquery = list.AsQueryable().Where("CustomerID == 2");
// Act
var result = list.AsQueryable().Where(config, "CustomerID != @0.Select(CustomerID).FirstOrDefault()", subquery).ToArray();
// Assert
result.Should().HaveCount(2);
}
I was just also debugging this part.
The root cause is that object is detected from that IEnnumerable helper class.
All value typed properties read from subquery are casted as
object
and can not be compared with other same typed value. Even trying withWrappedConstant()
.Fiddle that reproduce the issue: https://dotnetfiddle.net/slGSSp
Thanks