Skip to content

Commit 5e4d7f6

Browse files
committed
Fixed IEquatable and IComparable (#94)
1 parent e126552 commit 5e4d7f6

File tree

10 files changed

+111
-11
lines changed

10 files changed

+111
-11
lines changed

ChangeLog.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
https://github.com/GitTools/GitReleaseNotes
22

3-
GitReleaseNotes.exe . /OutputFile CHANGELOG.md /Version 1.0.7.5
3+
GitReleaseNotes.exe . /OutputFile CHANGELOG.md /Version 1.0.7.6

src/EntityFramework.DynamicLinq/EntityFramework.DynamicLinq.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Description>Dynamic Linq extensions for EntityFramework which adds Async support</Description>
44
<AssemblyTitle>EntityFramework.DynamicLinq</AssemblyTitle>
5-
<VersionPrefix>1.0.4.4</VersionPrefix>
5+
<VersionPrefix>1.0.4.6</VersionPrefix>
66
<Authors>Stef Heyenrath</Authors>
77
<TargetFrameworks>net45;net46</TargetFrameworks>
88
<DefineConstants>EF</DefineConstants>

src/Microsoft.EntityFrameworkCore.DynamicLinq/Microsoft.EntityFrameworkCore.DynamicLinq.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Description>Dynamic Linq extensions for Microsoft.EntityFrameworkCore which adds Async support</Description>
44
<AssemblyTitle>Microsoft.EntityFrameworkCore.DynamicLinq</AssemblyTitle>
5-
<VersionPrefix>1.0.4.5</VersionPrefix>
5+
<VersionPrefix>1.0.4.6</VersionPrefix>
66
<Authors>Stef Heyenrath</Authors>
77
<TargetFrameworks>net451;net46;netstandard1.3;uap10.0</TargetFrameworks>
88
<DefineConstants>$(DefineConstants);EFCORE</DefineConstants>

src/System.Linq.Dynamic.Core/ExpressionParser.cs

+35-6
Original file line numberDiff line numberDiff line change
@@ -700,8 +700,24 @@ Expression ParseComparisonOperator()
700700
}
701701
else
702702
{
703-
CheckAndPromoteOperands(isEquality ? typeof(IEqualitySignatures) : typeof(IRelationalSignatures),
704-
op.Text, ref left, ref right, op.Pos);
703+
bool typesAreSameAndImplementCorrectInterface = false;
704+
if (left.Type == right.Type)
705+
{
706+
var interfaces = left.Type.GetInterfaces().Where(x => x.GetTypeInfo().IsGenericType);
707+
if (isEquality)
708+
{
709+
typesAreSameAndImplementCorrectInterface = interfaces.Any(x => x.GetGenericTypeDefinition() == typeof(IEquatable<>));
710+
}
711+
else
712+
{
713+
typesAreSameAndImplementCorrectInterface = interfaces.Any(x => x.GetGenericTypeDefinition() == typeof(IComparable<>));
714+
}
715+
}
716+
717+
if (!typesAreSameAndImplementCorrectInterface)
718+
{
719+
CheckAndPromoteOperands(isEquality ? typeof(IEqualitySignatures) : typeof(IRelationalSignatures), op.Text, ref left, ref right, op.Pos);
720+
}
705721
}
706722

707723
switch (op.Id)
@@ -1551,6 +1567,7 @@ static Type FindGenericType(Type generic, Type type)
15511567
{
15521568
if (type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == generic)
15531569
return type;
1570+
15541571
if (generic.GetTypeInfo().IsInterface)
15551572
{
15561573
foreach (Type intfType in type.GetInterfaces())
@@ -1559,8 +1576,10 @@ static Type FindGenericType(Type generic, Type type)
15591576
if (found != null) return found;
15601577
}
15611578
}
1579+
15621580
type = type.GetTypeInfo().BaseType;
15631581
}
1582+
15641583
return null;
15651584
}
15661585

@@ -1843,9 +1862,12 @@ static bool IsEnumType(Type type)
18431862
void CheckAndPromoteOperand(Type signatures, string opName, ref Expression expr, int errorPos)
18441863
{
18451864
Expression[] args = { expr };
1865+
18461866
MethodBase method;
18471867
if (FindMethod(signatures, "F", false, args, out method) != 1)
1848-
throw ParseError(errorPos, Res.IncompatibleOperand, opName, GetTypeName(args[0].Type));
1868+
{
1869+
throw IncompatibleOperandError(opName, expr, errorPos);
1870+
}
18491871

18501872
expr = args[0];
18511873
}
@@ -1864,9 +1886,14 @@ void CheckAndPromoteOperands(Type signatures, string opName, ref Expression left
18641886
right = args[1];
18651887
}
18661888

1867-
static Exception IncompatibleOperandsError(string opName, Expression left, Expression right, int pos)
1889+
static Exception IncompatibleOperandError(string opName, Expression expr, int errorPos)
18681890
{
1869-
return ParseError(pos, Res.IncompatibleOperands, opName, GetTypeName(left.Type), GetTypeName(right.Type));
1891+
return ParseError(errorPos, Res.IncompatibleOperand, opName, GetTypeName(expr.Type));
1892+
}
1893+
1894+
static Exception IncompatibleOperandsError(string opName, Expression left, Expression right, int errorPos)
1895+
{
1896+
return ParseError(errorPos, Res.IncompatibleOperands, opName, GetTypeName(left.Type), GetTypeName(right.Type));
18701897
}
18711898

18721899
static MemberInfo FindPropertyOrField(Type type, string memberName, bool staticAccess)
@@ -2107,8 +2134,10 @@ Expression PromoteExpression(Expression expr, Type type, bool exact, bool conver
21072134

21082135
if (IsCompatibleWith(expr.Type, type))
21092136
{
2110-
if (type.GetTypeInfo().IsValueType || exact || (expr.Type.GetTypeInfo().IsValueType && convertExpr))
2137+
if (type.GetTypeInfo().IsValueType || exact || expr.Type.GetTypeInfo().IsValueType && convertExpr)
2138+
{
21112139
return Expression.Convert(expr, type);
2140+
}
21122141

21132142
return expr;
21142143
}

src/System.Linq.Dynamic.Core/System.Linq.Dynamic.Core.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Description>This is a .NETStandard/ .NET Core port of the the Microsoft assembly for the .Net 4.0 Dynamic language functionality.</Description>
44
<AssemblyTitle>System.Linq.Dynamic.Core</AssemblyTitle>
5-
<VersionPrefix>1.0.7.5</VersionPrefix>
5+
<VersionPrefix>1.0.7.6</VersionPrefix>
66
<Authors>Microsoft;Scott Guthrie;King Wilder;Nathan Arnott;Stef Heyenrath</Authors>
77
<TargetFrameworks>net35;net40;net45;net46;netstandard1.3;uap10.0</TargetFrameworks>
88
<GenerateDocumentationFile>true</GenerateDocumentationFile>

test/EntityFramework.DynamicLinq.Tests.net452/EntityFramework.DynamicLinq.Tests.net452.csproj

+12
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@
4848
<Reference Include="Microsoft.AspNet.Identity.EntityFramework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
4949
<HintPath>..\..\packages\Microsoft.AspNet.Identity.EntityFramework.2.2.1\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll</HintPath>
5050
</Reference>
51+
<Reference Include="MongoDB.Bson, Version=2.4.4.0, Culture=neutral, processorArchitecture=MSIL">
52+
<HintPath>..\..\packages\MongoDB.Bson.2.4.4\lib\net45\MongoDB.Bson.dll</HintPath>
53+
</Reference>
54+
<Reference Include="MongoDB.Driver, Version=2.4.4.0, Culture=neutral, processorArchitecture=MSIL">
55+
<HintPath>..\..\packages\MongoDB.Driver.2.4.4\lib\net45\MongoDB.Driver.dll</HintPath>
56+
</Reference>
57+
<Reference Include="MongoDB.Driver.Core, Version=2.4.4.0, Culture=neutral, processorArchitecture=MSIL">
58+
<HintPath>..\..\packages\MongoDB.Driver.Core.2.4.4\lib\net45\MongoDB.Driver.Core.dll</HintPath>
59+
</Reference>
5160
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
5261
<HintPath>..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
5362
</Reference>
@@ -60,6 +69,9 @@
6069
<Reference Include="System" />
6170
<Reference Include="System.ComponentModel.DataAnnotations" />
6271
<Reference Include="System.Core" />
72+
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
73+
<HintPath>..\..\packages\System.Runtime.InteropServices.RuntimeInformation.4.0.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
74+
</Reference>
6375
<Reference Include="System.Xml.Linq" />
6476
<Reference Include="System.Data.DataSetExtensions" />
6577
<Reference Include="Microsoft.CSharp" />

test/EntityFramework.DynamicLinq.Tests.net452/packages.config

+4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
<package id="Linq.PropertyTranslator.Core" version="1.0.3.0" targetFramework="net452" />
55
<package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net452" />
66
<package id="Microsoft.AspNet.Identity.EntityFramework" version="2.2.1" targetFramework="net452" />
7+
<package id="MongoDB.Bson" version="2.4.4" targetFramework="net452" />
8+
<package id="MongoDB.Driver" version="2.4.4" targetFramework="net452" />
9+
<package id="MongoDB.Driver.Core" version="2.4.4" targetFramework="net452" />
710
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
811
<package id="NFluent" version="2.0.0-alpha" targetFramework="net452" />
912
<package id="QueryInterceptor.Core" version="1.0.5.0" targetFramework="net452" />
13+
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.0.0" targetFramework="net452" />
1014
<package id="xunit" version="2.2.0-beta4-build3444" targetFramework="net452" />
1115
<package id="xunit.abstractions" version="2.0.1" targetFramework="net452" />
1216
<package id="xunit.assert" version="2.2.0-beta4-build3444" targetFramework="net452" />

test/EntityFramework.DynamicLinq.Tests/EntityFramework.DynamicLinq.Tests.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
<ItemGroup>
3232
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20170106-08" />
33+
<PackageReference Include="MongoDB.Driver" Version="2.4.4" />
3334
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta5-build1225" />
3435
<PackageReference Include="Linq.PropertyTranslator.Core" Version="1.0.1" />
3536
<PackageReference Include="QueryInterceptor.Core" Version="1.0.3" />

test/System.Linq.Dynamic.Core.Tests/ExpressionTests.cs

+53
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Newtonsoft.Json.Linq;
88
using Xunit;
99
using NFluent;
10+
using MongoDB.Bson;
1011

1112
namespace System.Linq.Dynamic.Core.Tests
1213
{
@@ -38,6 +39,13 @@ public class TestGuidNullClass
3839
public int Id { get; set; }
3940
}
4041

42+
public class TestObjectIdClass
43+
{
44+
public int Id { get; set; }
45+
46+
public ObjectId ObjectId { get; set; }
47+
}
48+
4149
[Fact]
4250
public void ExpressionTests_Add_Number()
4351
{
@@ -943,6 +951,51 @@ public void ExpressionTests_Indexer_Issue57()
943951
Assert.Equal(expected, result);
944952
}
945953

954+
[Fact]
955+
public void ExpressionTests_IComparable_GreaterThan()
956+
{
957+
// Assign
958+
const string id = "111111111111111111111111";
959+
var queryable = new[] { new TestObjectIdClass { Id = 1, ObjectId = ObjectId.Parse(id) }, new TestObjectIdClass { Id = 2, ObjectId = ObjectId.Parse("221111111111111111111111") } }.AsQueryable();
960+
961+
// Act
962+
var result = queryable.Where(x => x.ObjectId > ObjectId.Parse(id)).ToArray();
963+
var dynamicResult = queryable.Where("it.ObjectId > @0", ObjectId.Parse(id)).ToArray();
964+
965+
// Assert
966+
Check.That(dynamicResult).ContainsExactly(result);
967+
}
968+
969+
[Fact]
970+
public void ExpressionTests_IEquatable_Equal()
971+
{
972+
// Assign
973+
const string id = "111111111111111111111111";
974+
var queryable = new[] { new TestObjectIdClass { Id = 1, ObjectId = ObjectId.Parse(id) }, new TestObjectIdClass { Id = 2, ObjectId = ObjectId.Parse("221111111111111111111111") } }.AsQueryable();
975+
976+
// Act
977+
var result = queryable.First(x => x.ObjectId == ObjectId.Parse(id));
978+
var dynamicResult = queryable.First("it.ObjectId == @0", ObjectId.Parse(id));
979+
980+
// Assert
981+
Check.That(dynamicResult.Id).Equals(result.Id);
982+
}
983+
984+
[Fact]
985+
public void ExpressionTests_IEquatable_NotEqual()
986+
{
987+
// Assign
988+
const string id = "111111111111111111111111";
989+
var queryable = new[] { new TestObjectIdClass { Id = 1, ObjectId = ObjectId.Parse(id) }, new TestObjectIdClass { Id = 2, ObjectId = ObjectId.Parse("221111111111111111111111") } }.AsQueryable();
990+
991+
// Act
992+
var result = queryable.First(x => x.ObjectId != ObjectId.Parse(id));
993+
var dynamicResult = queryable.First("it.ObjectId != @0", ObjectId.Parse(id));
994+
995+
// Assert
996+
Check.That(dynamicResult.Id).Equals(result.Id);
997+
}
998+
946999
[Fact]
9471000
public void ExpressionTests_LogicalAndOr()
9481001
{

test/System.Linq.Dynamic.Core.Tests/System.Linq.Dynamic.Core.Tests.csproj

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<ItemGroup>
1919
<PackageReference Include="Microsoft.DotNet.InternalAbstractions" Version="1.0.0" />
2020
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
21+
<PackageReference Include="MongoDB.Driver" Version="2.4.4" />
2122
<PackageReference Include="OpenCover" Version="4.6.519" />
2223
<PackageReference Include="ReportGenerator" Version="2.5.6" />
2324
<PackageReference Include="xunit.runner.console" Version="2.3.0-beta1-build3642" />
@@ -58,7 +59,7 @@
5859
<PackageReference Include="System.Threading.Tasks">
5960
<Version>4.3.0</Version>
6061
</PackageReference>
61-
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.3.0"/>
62+
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.3.0" />
6263
</ItemGroup>
6364

6465
<ItemGroup>

0 commit comments

Comments
 (0)