FastExpressionCompiler 3.0.0-preview-02

FastExpressionCompiler is 10-40x times faster than Expression.Compile()

This is a prerelease version of FastExpressionCompiler.
There is a newer prerelease version of this package available.
See the version list below for details.
Install-Package FastExpressionCompiler -Version 3.0.0-preview-02
dotnet add package FastExpressionCompiler --version 3.0.0-preview-02
<PackageReference Include="FastExpressionCompiler" Version="3.0.0-preview-02" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FastExpressionCompiler --version 3.0.0-preview-02
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Release Notes

## v3.0.0 - Major feature release

The version contains a lot of fixes and improvements and hopefully as-little-as-possible breaking changes.

### **FastExpressionCompiler** and **FastExpressionCompiler.LightExpression**

- Performance and memory consumption is improved, especially for the expressions with the closure and for expressions with the nested lambdas.
- Filled the gaps in the expressions support.
- Many fixes in the IL emit.

### **FastExpressionCompiler.LightExpression**

- Fixes the compatibility (the drop-in replacement) between `FastExpressionCompiler.LightExpression.Expression` and `System.Linq.Expression`.
- Minimizing memory consumption by the created expressions.
- Now includes the `ExpressionVisitor`.
- Adds `ToCSharpString()` to output the C# code described by expression (tries hard).
- Adds `ToExpressionString()` to output expression construction in the C# code, so given an expression object you'll get e.g. `Expression.Lambda(Expression.New(...))`.

### The full list of fixes

[Milestone v3.0.0](https://github.com/dadhi/FastExpressionCompiler/milestone/19)

NuGet packages (22)

Showing the top 5 NuGet packages that depend on FastExpressionCompiler:

Package Downloads
Miruken
Miruken handles your application
ExpressionToCodeLib
Generates valid, readable C# from an expression tree, and can annotate that code with runtime values. Useful for e.g. code generation and unit testing assertions.
Dos.ORM
Dos.ORM(原Hxj.Data)于2009年发布、2015年正式开源,支持Core,该组件已在大量成熟项目中应用。初期开发过程中参考了NBear与MySoft,吸取了他们的一些精华,加入新思想,后期参考EF的Lambda语法进行大量扩展。官方网站:https://www.ITdos.com/Dos/ORM/Index.html,交流QQ群:60831381。
TestBase
*TestBase* gives you a flying start with - fluent assertions that are easy to extend - sharp error messages - tools to help you test with “heavyweight” dependencies on - AspNetCore.Mvc, AspNet.Mvc or WebApi Contexts - HttpClient - Ado.Net - Streams & Logging - Mix & match with your favourite test runners & assertions. ``` UnitUnderTest.Action() .ShouldNotBeNull() .ShouldEqualByValueExceptFor(new {Id=1, Descr=expected}, ignoreList ) .Payload .ShouldMatchIgnoringCase("I expected this") .Should(someOtherPredicate); .Items .ShouldAll(predicate) .ShouldContain(item) .ShouldNotContain(predicate) .Where(predicate) .SingleOrAssertFail() .ShouldEqualByValue().ShouldEqualByValueExceptFor(...).ShouldEqualByValueOnMembers() work with all kinds of object and collections, and report what differed. string.ShouldMatch(pattern).ShouldNotMatch().ShouldBeEmpty().ShouldNotBeEmpty() .ShouldNotBeNullOrEmptyOrWhiteSpace().ShouldEqualIgnoringCase() .ShouldContain().ShouldStartWith().ShouldEndWith().ShouldBeContainedIn(), ... numeric.ShouldBeBetween().ShouldEqualWithTolerance()....GreaterThan....LessThan...GreaterOrEqualTo ... ienumerable.ShouldAll().ShouldContain().ShouldNotContain().ShouldBeEmpty().ShouldNotBeEmpty() ... stream.ShouldHaveSameStreamContentAs().ShouldContain() value.ShouldBe().ShouldNotBe().ShouldBeOfType().ShouldBeAssignableTo()... ``` TestBase.HttpClient.Fake ``` new FakeHttpClient() .Setup(x=>x.RequestUri.PathAndQuery.StartsWith("/this")) .Returns(response) .Setup(x=>x.Method==HttpMethod.Put) .Returns(new HttpResponseMessage(HttpStatusCode.Accepted)); ``` TestBase.AdoNet ------------------ `FakeDbConnection` ``` - db.SetupForQuery(…) - db.SetupForExecuteNonQuery(…) - db.ShouldHaveUpdated("tableName", …) - db.ShouldHaveSelected("tableName", …) - db.ShouldHaveDeleted("tableName", …) - db.Verify( x=>x.CommandText.Matches("Insert [case] .*") && x.Parameters["id"].Value==1 ) - db .ShouldHaveInvoked(cmd => predicate(cmd)) .ShouldHaveParameter("name", value) ``` `RecordingDbConnection` TestBase.Mvc.AspNetCore & TestBase.Mvc for Mvc 4 & Mvc 5 -------------------------------------------------------- ``` ControllerUnderTest.WithControllerContext() .Action() .ShouldbeViewResult() .ShouldHaveModel<TModel>() .ShouldEqualByValue(expected) ControllerUnderTest.Action() .ShouldBeRedirectToRouteResult() .ShouldHaveRouteValue("expectedKey", [Optional] "expectedValue"); ShouldHaveViewDataContaining(), ShouldBeJsonResult() etc. ``` - Test AspNetCore controllers with zero setup using `controllerUnderTest.WithControllerContext(actionUnderTest)` - Test more complex AspNetCore controller/application dependencies using `HostedMvcTestFixtureBase` and specify your MVCApplications `Startup` class. ``` [TestCase("/dummy")] public async Task Put_Should_ReturnA(string url) { var httpClient=GivenClientForRunningServer<Startup>(); GivenRequestHeaders(httpClient, "CustomHeader", "HeaderValue1"); var result = await httpClient.PutAsync(url, json); result.ShouldBe_202Accepted(); } ``` For Mvc4 and Mvc 5, fake your http request &amp; context, and use the `RegisterRoutes` method of your actual application to set up `Controller.Url` ``` ControllerUnderTest .WithHttpContextAndRoutes( RouteConfig.RegisterRoutes, "/incomingurl" ); ApiControllerUnderTest.WithWebApiHttpContext<T>( httpMethod, requestUri, routeTemplate) ``` Testable Logging ``` // Extensions.Logging.ListOfString var log = new List<String>(); ILogger mslogger= new LoggerFactory().AddStringListLogger(log).CreateLogger("Test2"); // Serilog.Sinks.ListOfString Serilog.Logger slogger= new LoggerConfiguration().WriteTo.StringList(log).CreateLogger(); ```
RulesEngine
Rules Engine is a package for abstracting business logic/rules/policies out of the system. This works in a very simple way by giving you an ability to put your rules in a store outside the core logic of the system thus ensuring that any change in rules doesn't affect the core system.

GitHub repositories (4)

Showing the top 4 popular GitHub repositories that depend on FastExpressionCompiler:

Repository Stars
MapsterMapper/Mapster
A fast, fun and stimulating object to object Mapper
microsoft/RulesEngine
A Json based Rules Engine with extensive Dynamic expression support
itdos/Dos.ORM
Dos.ORM于2009年发布、2015年正式开源,该组件已在数百个成熟项目中应用。初期开发过程中吸取了NBear与MySoft的一些精华并加入新思想,之后参考EF Lambda语法进行大量扩展。经过数十个版本的更新迭代发布全新v2.0版本,支持动态列/表、分库/分表等。官方网站:https://www.itdos.com/dos/orm/Index.html 交流群:60831381
EamonNerbonne/ExpressionToCode
Generates valid, readable C# from an Expression Tree.

Version History

Version Downloads Last updated
3.0.0-preview-06 47 12/1/2020
3.0.0-preview-05 86 11/27/2020
3.0.0-preview-04 118 11/3/2020
3.0.0-preview-03 54 11/2/2020
3.0.0-preview-02 493 10/23/2020
3.0.0-preview-01 53 10/23/2020
2.0.0 150,246 1/25/2019
2.0.0-preview-03 870 11/9/2018
2.0.0-preview-02 655 10/25/2018
2.0.0-preview-01 395 10/24/2018
1.10.1 23,375 8/8/2018
1.10.0 465 8/3/2018
1.9.0 984 7/24/2018
1.8.0 17,132 6/24/2018
1.7.2 3,932 6/7/2018
1.7.1 10,313 3/27/2018
1.7.0 6,368 3/17/2018
1.6.0 13,413 12/3/2017
1.5.0 2,042 11/12/2017
1.4.0 6,702 9/9/2017
1.3.0 726 8/28/2017
1.2.2 1,025 8/8/2017
1.2.1 635 8/8/2017
1.2.0 633 8/8/2017
1.1.1 90,100 7/18/2017
1.1.0 575 7/13/2017
1.0.1 1,141 5/26/2017
1.0.0 1,121 4/2/2017
1.0.0-preview-04 592 3/31/2017
1.0.0-preview-03 865 3/30/2017
1.0.0-preview-02 575 3/29/2017
1.0.0-preview-01 668 3/23/2017