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
+
+
+