Skip to content

Commit

Permalink
Add support of Interpolated strings. (#530)
Browse files Browse the repository at this point in the history
* Add support of Interpolated strings. #527

* rename:EFDynamicQueryable_FS_Extensions.cs-->EFDynamicQueryableWithFormattableStringExtensions.cs and DynamicQueryable_FormattableString_Extensions.cs --> DynamicQueryableWithFormattableStringExtensions.cs

* Formatted the code
  • Loading branch information
yangzhongke authored Jul 17, 2021
1 parent bd3fe7c commit 4008215
Show file tree
Hide file tree
Showing 6 changed files with 1,324 additions and 0 deletions.
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,19 @@ var query = db.Customers
.Select("new(CompanyName as Name, Phone)");
```

Interpolated strings are supported on .NET 4.6(and above), .NET Core 2.1(and above), .NET Standard 1.3(and above) and UAP 10.0(and above).
For example:
```csharp
string cityName = "London";
int c = 10;
db.Customers
.WhereInterpolated($"City == {cityName} and Orders.Count >= {c}");

users.FirstInterpolated($"Income > {value}");

context.Blogs.CountInterpolatedAsync($"Name.Contains({search})");
```

## Useful links

- [Website](https://dynamic-linq.net/)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
#if EFCORE
using Microsoft.EntityFrameworkCore.Query;
using Microsoft.EntityFrameworkCore.Query.Internal;
#else
using System.Data.Entity.Infrastructure;
#endif
using System;
using System.Diagnostics;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Linq.Dynamic.Core.Validation;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using JetBrains.Annotations;
using System.Text.RegularExpressions;

#if EFCORE
namespace Microsoft.EntityFrameworkCore.DynamicLinq
#else
namespace EntityFramework.DynamicLinq
#endif
{
#if EFCORE || (NET46_OR_GREATER || NET5_0_OR_GREATER || NETCOREAPP2_1_OR_GREATER || NETSTANDARD1_3_OR_GREATER || UAP10_0)
public static class EFDynamicQueryableWithFormattableStringExtensions
{

private static string ParseFormattableString(FormattableString predicate, out object[] args)
{
string predicateStr = predicate.Format;
predicateStr = Regex.Replace(predicateStr, @"{(\d+)}", "@$1");//replace {0} with @0
args = predicate.GetArguments();
return predicateStr;
}

[PublicAPI]
public static Task<bool> AllInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.AllAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<bool> AllInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate, CancellationToken cancellationToken = default(CancellationToken))
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.AllAsync(source, predicateStr, cancellationToken, args);
}

[PublicAPI]
public static Task<bool> AnyInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.AnyAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<bool> AnyInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate, CancellationToken cancellationToken = default(CancellationToken))
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.AnyAsync(source, predicateStr, cancellationToken, args);
}

[PublicAPI]
public static Task<double> AverageInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString selector)
{
string selectorStr = ParseFormattableString(selector, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.AverageAsync(source, selectorStr, args);
}


[PublicAPI]
public static Task<double> AverageInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString selector, CancellationToken cancellationToken = default(CancellationToken))
{
string selectorStr = ParseFormattableString(selector, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.AverageAsync(source, selectorStr, cancellationToken, args);
}

[PublicAPI]
public static Task<int> CountInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.CountAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<int> CountInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.CountAsync(source, cancellationToken, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> FirstInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.FirstAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> FirstInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.FirstAsync(source, cancellationToken, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> FirstOrDefaultInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.FirstOrDefaultAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> FirstOrDefaultInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.FirstOrDefaultAsync(source, cancellationToken, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> LastInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.LastAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> LastInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.LastAsync(source, cancellationToken, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> LastOrDefaultInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.LastOrDefaultAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> LastOrDefaultInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.LastOrDefaultAsync(source, cancellationToken, predicateStr, args);
}

[PublicAPI]
public static Task<long> LongCountInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.LongCountAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<long> LongCountInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.LongCountAsync(source, cancellationToken, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> SingleOrDefaultInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.SingleOrDefaultAsync(source, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> SingleOrDefaultInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
{
string predicateStr = ParseFormattableString(predicate, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.SingleOrDefaultAsync(source, cancellationToken, predicateStr, args);
}

[PublicAPI]
public static Task<dynamic> SumInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString selector)
{
string selectorStr = ParseFormattableString(selector, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.SumAsync(source, selectorStr, args);
}

[PublicAPI]
public static Task<dynamic> SumInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString selector)
{
string selectorStr = ParseFormattableString(selector, out object[] args);
return EntityFrameworkDynamicQueryableExtensions.SumAsync(source, cancellationToken, selectorStr, args);
}

}
#endif
}
Loading

0 comments on commit 4008215

Please sign in to comment.