From fd9ef32dc16d0e97acaa272db66b7d32384a1137 Mon Sep 17 00:00:00 2001 From: Tomas Lycken Date: Wed, 1 Nov 2017 11:59:25 +0100 Subject: [PATCH] Extract QueryableExtensions into own NuGet package (#37) --- src/RdbmsEventStore.sln | 13 ++++++++++ src/RdbmsEventStore/RdbmsEventStore.csproj | 4 ++++ .../QueryableExtensions.cs | 24 +++++++++++++++++++ .../tlycken.Extensions.Tests.csproj | 19 +++++++++++++++ src/tlycken.Extensions/FuncExtensions.cs | 19 +++++++++++++++ .../tlycken.Extensions.csproj | 7 ++++++ 6 files changed, 86 insertions(+) create mode 100644 src/tlycken.Extensions.Tests/QueryableExtensions.cs create mode 100644 src/tlycken.Extensions.Tests/tlycken.Extensions.Tests.csproj create mode 100644 src/tlycken.Extensions/FuncExtensions.cs create mode 100644 src/tlycken.Extensions/tlycken.Extensions.csproj diff --git a/src/RdbmsEventStore.sln b/src/RdbmsEventStore.sln index 75e6cb1..1e31688 100644 --- a/src/RdbmsEventStore.sln +++ b/src/RdbmsEventStore.sln @@ -25,6 +25,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RdbmsEventStore.Tests", "Rd EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RdbmsEventStore.EntityFramework.Tests", "RdbmsEventStore.EntityFramework.Tests\RdbmsEventStore.EntityFramework.Tests.csproj", "{0096C881-9347-454E-B0A0-73C7CABDBF37}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tlycken.Extensions", "tlycken.Extensions\tlycken.Extensions.csproj", "{3D60C8BA-ACC3-4CBC-B47C-79A504553C93}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tlycken.Extensions.Tests", "tlycken.Extensions.Tests\tlycken.Extensions.Tests.csproj", "{08FAE0C2-B435-4BA9-8CC4-52EC7FE1EDD6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -47,6 +51,14 @@ Global {0096C881-9347-454E-B0A0-73C7CABDBF37}.Debug|Any CPU.Build.0 = Debug|Any CPU {0096C881-9347-454E-B0A0-73C7CABDBF37}.Release|Any CPU.ActiveCfg = Release|Any CPU {0096C881-9347-454E-B0A0-73C7CABDBF37}.Release|Any CPU.Build.0 = Release|Any CPU + {3D60C8BA-ACC3-4CBC-B47C-79A504553C93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D60C8BA-ACC3-4CBC-B47C-79A504553C93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D60C8BA-ACC3-4CBC-B47C-79A504553C93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D60C8BA-ACC3-4CBC-B47C-79A504553C93}.Release|Any CPU.Build.0 = Release|Any CPU + {08FAE0C2-B435-4BA9-8CC4-52EC7FE1EDD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08FAE0C2-B435-4BA9-8CC4-52EC7FE1EDD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08FAE0C2-B435-4BA9-8CC4-52EC7FE1EDD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08FAE0C2-B435-4BA9-8CC4-52EC7FE1EDD6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -54,6 +66,7 @@ Global GlobalSection(NestedProjects) = preSolution {E58D4AE3-79B6-4B36-9693-9D852222D06E} = {B3BDC65F-EA8A-4CDC-85FC-0AA1C48C95A8} {0096C881-9347-454E-B0A0-73C7CABDBF37} = {B3BDC65F-EA8A-4CDC-85FC-0AA1C48C95A8} + {08FAE0C2-B435-4BA9-8CC4-52EC7FE1EDD6} = {B3BDC65F-EA8A-4CDC-85FC-0AA1C48C95A8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CA4860B3-3208-41C0-8FB9-719E00FBAD0D} diff --git a/src/RdbmsEventStore/RdbmsEventStore.csproj b/src/RdbmsEventStore/RdbmsEventStore.csproj index f3e5deb..5c42d74 100644 --- a/src/RdbmsEventStore/RdbmsEventStore.csproj +++ b/src/RdbmsEventStore/RdbmsEventStore.csproj @@ -22,4 +22,8 @@ + + + + diff --git a/src/tlycken.Extensions.Tests/QueryableExtensions.cs b/src/tlycken.Extensions.Tests/QueryableExtensions.cs new file mode 100644 index 0000000..89cadf9 --- /dev/null +++ b/src/tlycken.Extensions.Tests/QueryableExtensions.cs @@ -0,0 +1,24 @@ +using System; +using System.Linq; +using Xunit; + +namespace tlycken.Extensions.Tests +{ + public class QueryableExtensions + { + public class Foo + { + public bool Bar { get; set; } + } + + [Fact] + public void CanApplyProjectionToQueryables() + { + var foos = new[] { new Foo { Bar = true }, new Foo { Bar = false }, new Foo { Bar = true } }.AsQueryable(); + + var result = foos.Apply(fs => fs.Where(foo => foo.Bar)); + + Assert.Equal(2, result.Count()); + } + } +} diff --git a/src/tlycken.Extensions.Tests/tlycken.Extensions.Tests.csproj b/src/tlycken.Extensions.Tests/tlycken.Extensions.Tests.csproj new file mode 100644 index 0000000..c9a3a38 --- /dev/null +++ b/src/tlycken.Extensions.Tests/tlycken.Extensions.Tests.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp2.0 + + false + + + + + + + + + + + + + diff --git a/src/tlycken.Extensions/FuncExtensions.cs b/src/tlycken.Extensions/FuncExtensions.cs new file mode 100644 index 0000000..877769e --- /dev/null +++ b/src/tlycken.Extensions/FuncExtensions.cs @@ -0,0 +1,19 @@ +// ReSharper disable once CheckNamespace +namespace System +{ + public static class FuncExtensions + { + /// + /// Fluently applies the function to the argument . + /// + /// My main use case for this as an abstraction for queryables, taking a + /// Func{IQueryable{S}, IQueryable{T}} as an argument and applying it + /// in a longer LINQ method chain. + /// The element type of the queryable sequence + /// The element type of the result + /// The source sequence + /// A projection to apply to the sequence + /// projection(source) + public static T Apply(this S source, Func projection) => projection(source); + } +} \ No newline at end of file diff --git a/src/tlycken.Extensions/tlycken.Extensions.csproj b/src/tlycken.Extensions/tlycken.Extensions.csproj new file mode 100644 index 0000000..9f5c4f4 --- /dev/null +++ b/src/tlycken.Extensions/tlycken.Extensions.csproj @@ -0,0 +1,7 @@ + + + + netstandard2.0 + + +