From 4be342bd753e70678f6a6278bced515a04c01b5f Mon Sep 17 00:00:00 2001 From: Scott McNally Date: Tue, 19 Dec 2017 16:32:46 -0600 Subject: [PATCH 1/3] Serializeable filter definition --- src/EntityFramework.DynamicFilters.sln | 4 ++-- .../DynamicFilterDefinition.cs | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/EntityFramework.DynamicFilters.sln b/src/EntityFramework.DynamicFilters.sln index ba581e0..95434ed 100644 --- a/src/EntityFramework.DynamicFilters.sln +++ b/src/EntityFramework.DynamicFilters.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27004.2005 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EntityFramework.DynamicFilters", "EntityFramework.DynamicFilters\EntityFramework.DynamicFilters.csproj", "{56E36AD1-E675-42F0-96CB-7F475E05E491}" EndProject diff --git a/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs b/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs index df0c014..854a97e 100644 --- a/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs +++ b/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs @@ -6,7 +6,8 @@ namespace EntityFramework.DynamicFilters { - internal class DynamicFilterDefinition + [Serializable] + public class DynamicFilterDefinition { /// /// Unique ID assigned to each distinct filter. Used to find unique filters on an entity @@ -22,16 +23,24 @@ internal class DynamicFilterDefinition /// public string ColumnName { get; private set; } + + + [NonSerialized] + private LambdaExpression _predicate; + + /// /// Set if the filter is a LambdaExpression. Null if filter is a single column equality filter. - /// - public LambdaExpression Predicate { get; private set; } + /// + + public LambdaExpression Predicate { get { return _predicate; } private set { _predicate = value; } } public Type CLRType { get; private set; } public DynamicFilterOptions Options { get; private set; } - public string AttributeName { get { return string.Concat(DynamicFilterConstants.ATTRIBUTE_NAME_PREFIX, DynamicFilterConstants.DELIMETER, CLRType.Name, DynamicFilterConstants.DELIMETER, FilterName); } } + public string AttributeName { get { return DynamicFilterConstants.ATTRIBUTE_NAME_PREFIX; } } + internal DynamicFilterDefinition(Guid id, string filterName, LambdaExpression predicate, string columnName, Type clrType, DynamicFilterOptions options) { @@ -81,6 +90,7 @@ public string CreateFilterDisabledParameterName(DataSpace dataSpace) /// /// /// + public static Tuple GetFilterAndParamFromDBParameter(string dbParameter) { if (!dbParameter.StartsWith(DynamicFilterConstants.PARAMETER_NAME_PREFIX)) @@ -89,7 +99,8 @@ public static Tuple GetFilterAndParamFromDBParameter( // parts are: // 1 = Fixed string constant (DynamicFilterConstants.PARAMETER_NAME_PREFIX) // 2 = Index number used to look up the Filter & Parameter name - var parts = dbParameter.Split(new string[] { DynamicFilterConstants.DELIMETER }, StringSplitOptions.None); + var parts = dbParameter.Split(new string[] { DynamicFilterConstants.DELIMETER + }, StringSplitOptions.None); if (parts.Length != 2) throw new ApplicationException(string.Format("Invalid format for Dynamic Filter parameter name: {0}", dbParameter)); From 8e418e78cd430dbaab88fb445a85a66f5212b10c Mon Sep 17 00:00:00 2001 From: Scott McNally Date: Tue, 19 Dec 2017 16:35:46 -0600 Subject: [PATCH 2/3] cleanup and add of dbconfig --- .../DynamicFilterDefinition.cs | 4 +--- .../EntityFramework.DynamicFilters.csproj | 7 +++++-- .../MyDbConfiguration.cs | 18 ++++++++++++++++++ .../packages.config | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 src/EntityFramework.DynamicFilters/MyDbConfiguration.cs diff --git a/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs b/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs index 854a97e..62b3146 100644 --- a/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs +++ b/src/EntityFramework.DynamicFilters/DynamicFilterDefinition.cs @@ -90,7 +90,6 @@ public string CreateFilterDisabledParameterName(DataSpace dataSpace) /// /// /// - public static Tuple GetFilterAndParamFromDBParameter(string dbParameter) { if (!dbParameter.StartsWith(DynamicFilterConstants.PARAMETER_NAME_PREFIX)) @@ -99,8 +98,7 @@ public static Tuple GetFilterAndParamFromDBParameter( // parts are: // 1 = Fixed string constant (DynamicFilterConstants.PARAMETER_NAME_PREFIX) // 2 = Index number used to look up the Filter & Parameter name - var parts = dbParameter.Split(new string[] { DynamicFilterConstants.DELIMETER - }, StringSplitOptions.None); + var parts = dbParameter.Split(new string[] { DynamicFilterConstants.DELIMETER }, StringSplitOptions.None); if (parts.Length != 2) throw new ApplicationException(string.Format("Invalid format for Dynamic Filter parameter name: {0}", dbParameter)); diff --git a/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj b/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj index 0cf4075..2a5b6cc 100644 --- a/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj +++ b/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj @@ -40,10 +40,12 @@ - ..\packages\EntityFramework.6.1.1\lib\net40\EntityFramework.dll + ..\packages\EntityFramework.6.2.0\lib\net40\EntityFramework.dll + True - ..\packages\EntityFramework.6.1.1\lib\net40\EntityFramework.SqlServer.dll + ..\packages\EntityFramework.6.2.0\lib\net40\EntityFramework.SqlServer.dll + True @@ -67,6 +69,7 @@ + diff --git a/src/EntityFramework.DynamicFilters/MyDbConfiguration.cs b/src/EntityFramework.DynamicFilters/MyDbConfiguration.cs new file mode 100644 index 0000000..8ae0c74 --- /dev/null +++ b/src/EntityFramework.DynamicFilters/MyDbConfiguration.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Data.Entity.Infrastructure; +using System.IO; +using System.Linq; +using System.Text; + +namespace EntityFramework.DynamicFilters +{ + public class MyDbConfiguration : DbConfiguration + { + public MyDbConfiguration() : base() + { + this.SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory())); + } + } +} diff --git a/src/EntityFramework.DynamicFilters/packages.config b/src/EntityFramework.DynamicFilters/packages.config index 16578b4..c39c5f1 100644 --- a/src/EntityFramework.DynamicFilters/packages.config +++ b/src/EntityFramework.DynamicFilters/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file From 7ae503b4cfb4f9d6bb6e9eec646bb2736b7ed61a Mon Sep 17 00:00:00 2001 From: Scott McNally Date: Tue, 19 Dec 2017 16:40:47 -0600 Subject: [PATCH 3/3] Add config and serializer --- .../DynamicFilterSerializer.cs | 31 +++++++++++++++++++ .../EntityFramework.DynamicFilters.csproj | 1 + .../MyDbConfiguration.cs | 1 + 3 files changed, 33 insertions(+) create mode 100644 src/EntityFramework.DynamicFilters/DynamicFilterSerializer.cs diff --git a/src/EntityFramework.DynamicFilters/DynamicFilterSerializer.cs b/src/EntityFramework.DynamicFilters/DynamicFilterSerializer.cs new file mode 100644 index 0000000..ecd9a4e --- /dev/null +++ b/src/EntityFramework.DynamicFilters/DynamicFilterSerializer.cs @@ -0,0 +1,31 @@ +using System; +using System.Data.Entity.Infrastructure; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +namespace EntityFramework.DynamicFilters +{ + internal class DynamicFilterSerializer : IMetadataAnnotationSerializer + { + public object Deserialize(string name, string value) + { + using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(value))) + { + var bf = new BinaryFormatter(); + + return (DynamicFilterDefinition)bf.Deserialize(ms); + } + } + + public string Serialize(string name, object value) + { + using (MemoryStream ms = new MemoryStream()) + { + var bf = new BinaryFormatter(); + bf.Serialize(ms, value); + + return Convert.ToBase64String(ms.ToArray()); + } + } + } +} \ No newline at end of file diff --git a/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj b/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj index 2a5b6cc..36caab5 100644 --- a/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj +++ b/src/EntityFramework.DynamicFilters/EntityFramework.DynamicFilters.csproj @@ -68,6 +68,7 @@ + diff --git a/src/EntityFramework.DynamicFilters/MyDbConfiguration.cs b/src/EntityFramework.DynamicFilters/MyDbConfiguration.cs index 8ae0c74..ce39c81 100644 --- a/src/EntityFramework.DynamicFilters/MyDbConfiguration.cs +++ b/src/EntityFramework.DynamicFilters/MyDbConfiguration.cs @@ -12,6 +12,7 @@ public class MyDbConfiguration : DbConfiguration { public MyDbConfiguration() : base() { + this.SetMetadataAnnotationSerializer("DynamicFilter", () => new DynamicFilterSerializer()); this.SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory())); } }