moved conversion into a different project.
This commit is contained in:
		
							parent
							
								
									118f7c30f8
								
							
						
					
					
						commit
						01e7652c06
					
				
							
								
								
									
										58
									
								
								PoweredSoft.Conversion/Convert.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								PoweredSoft.Conversion/Convert.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| using PoweredSoft.Types.Converters; | ||||
| using PoweredSoft.Types.Interface; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| 
 | ||||
| namespace PoweredSoft.Types | ||||
| { | ||||
|     public static class Converter | ||||
|     { | ||||
|         public static List<ITypeConverter> Converters { get; internal set; } = new List<ITypeConverter> | ||||
|         { | ||||
|             new StringToDateConverter(), | ||||
|             new StringToGuidConverter() | ||||
|         }; | ||||
| 
 | ||||
|         public static void RegisterConverter(ITypeConverter converter) | ||||
|         { | ||||
|             lock (Converters) | ||||
|             { | ||||
|                 Converters.Add(converter); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public static void ReplaceConverter(ITypeConverter converter, Type source, Type destination) | ||||
|         { | ||||
|             lock (Converters) | ||||
|             { | ||||
|                 Converters.RemoveAll(t => t.CanConvert(source, destination)); | ||||
|                 Converters.Add(converter); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public static object To(this object source, Type type) | ||||
|         { | ||||
|             object ret = null; | ||||
| 
 | ||||
|             // safe if null. | ||||
|             if (source == null) | ||||
|                 return ret; | ||||
| 
 | ||||
|             // establish final type. | ||||
|             var notNullType = Nullable.GetUnderlyingType(type); | ||||
|             var finalType = notNullType ?? type; | ||||
|             var converter = Converters.FirstOrDefault(t => t.CanConvert(source.GetType(), finalType)); | ||||
|             if (converter != null) | ||||
|                 ret = converter.Convert(source, finalType); | ||||
|             else | ||||
|                 ret = Convert.ChangeType(source, finalType); | ||||
| 
 | ||||
|             if (notNullType != null) | ||||
|                 ret = Activator.CreateInstance(type, new object[] { ret }); | ||||
| 
 | ||||
|             return ret; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								PoweredSoft.Conversion/Converters/StringToDateConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								PoweredSoft.Conversion/Converters/StringToDateConverter.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| using PoweredSoft.Types.Interface; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| 
 | ||||
| namespace PoweredSoft.Types.Converters | ||||
| { | ||||
|     public class StringToDateConverter : ITypeConverter | ||||
|     { | ||||
|         public bool CanConvert(Type source, Type destination) => source == typeof(string) && destination == typeof(DateTime); | ||||
|         public object Convert(object source, Type destination) => DateTime.Parse((string)source); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								PoweredSoft.Conversion/Converters/StringToGuidConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								PoweredSoft.Conversion/Converters/StringToGuidConverter.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| using PoweredSoft.Types.Interface; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| 
 | ||||
| namespace PoweredSoft.Types.Converters | ||||
| { | ||||
|     public class StringToGuidConverter : ITypeConverter | ||||
|     { | ||||
|         public bool CanConvert(Type source, Type destination) => source == typeof(string) && destination == typeof(Guid); | ||||
|         public object Convert(object source, Type destination) => Guid.Parse((string)source); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										12
									
								
								PoweredSoft.Conversion/Interface/ITypeConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								PoweredSoft.Conversion/Interface/ITypeConverter.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| 
 | ||||
| namespace PoweredSoft.Types.Interface | ||||
| { | ||||
|     public interface ITypeConverter | ||||
|     { | ||||
|         bool CanConvert(Type source, Type destination); | ||||
|         object Convert(object source, Type destination); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								PoweredSoft.Conversion/PoweredSoft.Types.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								PoweredSoft.Conversion/PoweredSoft.Types.csproj
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
| 
 | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>netstandard2.0</TargetFramework> | ||||
|   </PropertyGroup> | ||||
| 
 | ||||
| </Project> | ||||
| @ -37,6 +37,8 @@ namespace PoweredSoft.DynamicLinq.Dal | ||||
|             modelBuilder.Configurations.Add(new CommentConfiguration()); | ||||
|             modelBuilder.Configurations.Add(new PostConfiguration()); | ||||
|             modelBuilder.Configurations.Add(new WebsiteConfiguration()); | ||||
|             modelBuilder.Configurations.Add(new CommentLikeConfiguration()); | ||||
|             modelBuilder.Configurations.Add(new UniqueConfiguration()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -9,6 +9,23 @@ using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace PoweredSoft.DynamicLinq.Dal.Configurations | ||||
| { | ||||
|     public class UniqueConfiguration : EntityTypeConfiguration<Unique> | ||||
|     { | ||||
|         public UniqueConfiguration() : this("dbo") | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public UniqueConfiguration(string schema) | ||||
|         { | ||||
|             ToTable("Unique", schema); | ||||
|             HasKey(t => t.Id); | ||||
|             Property(t => t.Id).HasColumnName("Id").HasColumnType("bigint").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); | ||||
|             Property(t => t.RowNumber).HasColumnType("uniqueidentifier").IsRequired(); | ||||
|             Property(t => t.OtherNullableGuid).HasColumnType("uniqueidentifier"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public class AuthorConfiguration : EntityTypeConfiguration<Author> | ||||
|     { | ||||
|         public AuthorConfiguration() : this("dbo") | ||||
|  | ||||
							
								
								
									
										15
									
								
								PoweredSoft.DynamicLinq.Dal/Pocos/Uniqe.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								PoweredSoft.DynamicLinq.Dal/Pocos/Uniqe.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace PoweredSoft.DynamicLinq.Dal.Pocos | ||||
| { | ||||
|     public class Unique | ||||
|     { | ||||
|         public long Id { get; set; } | ||||
|         public Guid RowNumber { get; set; } | ||||
|         public Guid? OtherNullableGuid { get; set; } | ||||
|     } | ||||
| } | ||||
| @ -50,6 +50,7 @@ | ||||
|   <ItemGroup> | ||||
|     <Compile Include="BlogContext.cs" /> | ||||
|     <Compile Include="Configurations\Configurations.cs" /> | ||||
|     <Compile Include="Pocos\Uniqe.cs" /> | ||||
|     <Compile Include="Pocos\Website.cs" /> | ||||
|     <Compile Include="Pocos\CommentLike.cs" /> | ||||
|     <Compile Include="Pocos\Post.cs" /> | ||||
|  | ||||
| @ -42,6 +42,14 @@ namespace PoweredSoft.DynamicLinq.Test | ||||
|             Assert.IsTrue(Posts.AsQueryable().Query(t => t.Equal("Id", 1, QueryConvertStrategy.LeaveAsIs)).Any()); | ||||
|         } | ||||
| 
 | ||||
|         [TestMethod] | ||||
|         public void TestGuid() | ||||
|         { | ||||
|             var randomGuidStr = Guid.NewGuid().ToString(); | ||||
|             TestData.Uniques.AsQueryable().Query(t => t.Equal("RowNumber", randomGuidStr)); | ||||
|             TestData.Uniques.AsQueryable().Query(t => t.Equal("OtherNullableGuid", randomGuidStr)); | ||||
|         } | ||||
| 
 | ||||
|         [TestMethod] | ||||
|         public void SpecifyType() | ||||
|         { | ||||
|  | ||||
| @ -54,6 +54,9 @@ | ||||
|     <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> | ||||
|       <HintPath>..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath> | ||||
|     </Reference> | ||||
|     <Reference Include="PoweredSoft.Types, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> | ||||
|       <HintPath>..\packages\PoweredSoft.Types.1.0.0\lib\netstandard2.0\PoweredSoft.Types.dll</HintPath> | ||||
|     </Reference> | ||||
|     <Reference Include="System" /> | ||||
|     <Reference Include="System.ComponentModel.DataAnnotations" /> | ||||
|     <Reference Include="System.Core" /> | ||||
|  | ||||
| @ -34,6 +34,12 @@ namespace PoweredSoft.DynamicLinq.Test | ||||
| 
 | ||||
|     internal static class TestData | ||||
|     { | ||||
|         static readonly internal List<Unique> Uniques = new List<Unique> | ||||
|         { | ||||
|             new Unique { Id = 1, RowNumber = Guid.NewGuid(), OtherNullableGuid = null } , | ||||
|             new Unique { Id = 2, RowNumber = Guid.NewGuid(), OtherNullableGuid = Guid.NewGuid() } | ||||
|         }; | ||||
| 
 | ||||
|         static readonly internal List<MockPersonObject> Persons = new List<MockPersonObject> | ||||
|         { | ||||
|             new MockPersonObject { FirstName = "David", LastName = "Lebee", Age = 28 }, | ||||
|  | ||||
| @ -4,4 +4,5 @@ | ||||
|   <package id="Faker.Data" version="1.0.7" targetFramework="net461" /> | ||||
|   <package id="MSTest.TestAdapter" version="1.2.0" targetFramework="net461" /> | ||||
|   <package id="MSTest.TestFramework" version="1.2.0" targetFramework="net461" /> | ||||
|   <package id="PoweredSoft.Types" version="1.0.0" targetFramework="net462" /> | ||||
| </packages> | ||||
| @ -13,6 +13,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PoweredSoft.DynamicLinq.Ent | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.DynamicLinq.ConsoleApp", "PoweredSoft.DynamicLinq.ConsoleApp\PoweredSoft.DynamicLinq.ConsoleApp.csproj", "{A166BD89-7BF3-475B-871F-294B8A420D9E}" | ||||
| EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{77B4027B-ECB0-4ED1-8646-025AC4146CE2}" | ||||
| 	ProjectSection(SolutionItems) = preProject | ||||
| 		README.md = README.md | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Any CPU = Debug|Any CPU | ||||
|  | ||||
| @ -327,17 +327,8 @@ namespace PoweredSoft.DynamicLinq.Helpers | ||||
|             if (value == null) | ||||
|                 return Expression.Constant(null); | ||||
| 
 | ||||
|             // the types. | ||||
|             var valueType = value.GetType(); | ||||
|             var memberType = member.Type; | ||||
| 
 | ||||
|             // if match. | ||||
|             if (valueType == memberType) | ||||
|                 return Expression.Constant(value); | ||||
| 
 | ||||
|             // attempt a conversion. | ||||
|             object convertedValue = TypeHelpers.ConvertFrom(memberType, value); | ||||
|             return Expression.Constant(convertedValue, memberType); | ||||
|             var convertedValue = PoweredSoft.Types.Converter.To(value, member.Type); | ||||
|             return Expression.Constant(convertedValue, member.Type); | ||||
|         } | ||||
| 
 | ||||
|         public static ConstantExpression ResolveConstant(Expression member, object value, QueryConvertStrategy convertStrategy) | ||||
| @ -474,7 +465,7 @@ namespace PoweredSoft.DynamicLinq.Helpers | ||||
|             foreach (var o in enumerableValue) | ||||
|             { | ||||
|                 if (convertStrategy == QueryConvertStrategy.ConvertConstantToComparedPropertyOrField) | ||||
|                     list.Add(TypeHelpers.ConvertFrom(memberExpression.Type, o)); | ||||
|                     list.Add(PoweredSoft.Types.Converter.To(o, memberExpression.Type)); | ||||
|                 else | ||||
|                     list.Add(o); | ||||
|             } | ||||
|  | ||||
| @ -24,26 +24,7 @@ namespace PoweredSoft.DynamicLinq.Helpers | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public static object ConvertFrom(Type type, object source) | ||||
|         { | ||||
|             object ret = null; | ||||
|       | ||||
|             // safe if null. | ||||
|             if (source == null) | ||||
|                 return ret; | ||||
| 
 | ||||
|             // not nullable type. | ||||
|             var notNullableType = Nullable.GetUnderlyingType(type); | ||||
|             if (notNullableType == null) | ||||
|             { | ||||
|                 ret = Convert.ChangeType(source, type); | ||||
|                 return ret; | ||||
|             } | ||||
| 
 | ||||
|             // the ret. | ||||
|             ret = Convert.ChangeType(source, notNullableType); | ||||
|             return ret; | ||||
|         } | ||||
| 
 | ||||
|         /* | ||||
|         /// <summary> | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| 
 | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>netstandard2.0</TargetFramework> | ||||
|     <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
|     <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
|     <Company>Powered Softwares Inc.</Company> | ||||
|     <Authors>David Lebée</Authors> | ||||
|     <Copyright></Copyright> | ||||
| @ -22,6 +22,7 @@ | ||||
|   </ItemGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="PoweredSoft.Types" Version="1.0.0" /> | ||||
|     <PackageReference Include="System.Reflection.Emit" Version="4.3.0" /> | ||||
|   </ItemGroup> | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user