Skip to content

Commit 4008215

Browse files
authored
Add support of Interpolated strings. (#530)
* Add support of Interpolated strings. #527 * rename:EFDynamicQueryable_FS_Extensions.cs-->EFDynamicQueryableWithFormattableStringExtensions.cs and DynamicQueryable_FormattableString_Extensions.cs --> DynamicQueryableWithFormattableStringExtensions.cs * Formatted the code
1 parent bd3fe7c commit 4008215

File tree

6 files changed

+1324
-0
lines changed

6 files changed

+1324
-0
lines changed

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@ var query = db.Customers
2222
.Select("new(CompanyName as Name, Phone)");
2323
```
2424

25+
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).
26+
For example:
27+
```csharp
28+
string cityName = "London";
29+
int c = 10;
30+
db.Customers
31+
.WhereInterpolated($"City == {cityName} and Orders.Count >= {c}");
32+
33+
users.FirstInterpolated($"Income > {value}");
34+
35+
context.Blogs.CountInterpolatedAsync($"Name.Contains({search})");
36+
```
37+
2538
## Useful links
2639

2740
- [Website](https://dynamic-linq.net/)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
#if EFCORE
2+
using Microsoft.EntityFrameworkCore.Query;
3+
using Microsoft.EntityFrameworkCore.Query.Internal;
4+
#else
5+
using System.Data.Entity.Infrastructure;
6+
#endif
7+
using System;
8+
using System.Diagnostics;
9+
using System.Linq;
10+
using System.Linq.Dynamic.Core;
11+
using System.Linq.Dynamic.Core.Validation;
12+
using System.Linq.Expressions;
13+
using System.Reflection;
14+
using System.Threading;
15+
using System.Threading.Tasks;
16+
using JetBrains.Annotations;
17+
using System.Text.RegularExpressions;
18+
19+
#if EFCORE
20+
namespace Microsoft.EntityFrameworkCore.DynamicLinq
21+
#else
22+
namespace EntityFramework.DynamicLinq
23+
#endif
24+
{
25+
#if EFCORE || (NET46_OR_GREATER || NET5_0_OR_GREATER || NETCOREAPP2_1_OR_GREATER || NETSTANDARD1_3_OR_GREATER || UAP10_0)
26+
public static class EFDynamicQueryableWithFormattableStringExtensions
27+
{
28+
29+
private static string ParseFormattableString(FormattableString predicate, out object[] args)
30+
{
31+
string predicateStr = predicate.Format;
32+
predicateStr = Regex.Replace(predicateStr, @"{(\d+)}", "@$1");//replace {0} with @0
33+
args = predicate.GetArguments();
34+
return predicateStr;
35+
}
36+
37+
[PublicAPI]
38+
public static Task<bool> AllInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
39+
{
40+
string predicateStr = ParseFormattableString(predicate, out object[] args);
41+
return EntityFrameworkDynamicQueryableExtensions.AllAsync(source, predicateStr, args);
42+
}
43+
44+
[PublicAPI]
45+
public static Task<bool> AllInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate, CancellationToken cancellationToken = default(CancellationToken))
46+
{
47+
string predicateStr = ParseFormattableString(predicate, out object[] args);
48+
return EntityFrameworkDynamicQueryableExtensions.AllAsync(source, predicateStr, cancellationToken, args);
49+
}
50+
51+
[PublicAPI]
52+
public static Task<bool> AnyInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
53+
{
54+
string predicateStr = ParseFormattableString(predicate, out object[] args);
55+
return EntityFrameworkDynamicQueryableExtensions.AnyAsync(source, predicateStr, args);
56+
}
57+
58+
[PublicAPI]
59+
public static Task<bool> AnyInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate, CancellationToken cancellationToken = default(CancellationToken))
60+
{
61+
string predicateStr = ParseFormattableString(predicate, out object[] args);
62+
return EntityFrameworkDynamicQueryableExtensions.AnyAsync(source, predicateStr, cancellationToken, args);
63+
}
64+
65+
[PublicAPI]
66+
public static Task<double> AverageInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString selector)
67+
{
68+
string selectorStr = ParseFormattableString(selector, out object[] args);
69+
return EntityFrameworkDynamicQueryableExtensions.AverageAsync(source, selectorStr, args);
70+
}
71+
72+
73+
[PublicAPI]
74+
public static Task<double> AverageInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString selector, CancellationToken cancellationToken = default(CancellationToken))
75+
{
76+
string selectorStr = ParseFormattableString(selector, out object[] args);
77+
return EntityFrameworkDynamicQueryableExtensions.AverageAsync(source, selectorStr, cancellationToken, args);
78+
}
79+
80+
[PublicAPI]
81+
public static Task<int> CountInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
82+
{
83+
string predicateStr = ParseFormattableString(predicate, out object[] args);
84+
return EntityFrameworkDynamicQueryableExtensions.CountAsync(source, predicateStr, args);
85+
}
86+
87+
[PublicAPI]
88+
public static Task<int> CountInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
89+
{
90+
string predicateStr = ParseFormattableString(predicate, out object[] args);
91+
return EntityFrameworkDynamicQueryableExtensions.CountAsync(source, cancellationToken, predicateStr, args);
92+
}
93+
94+
[PublicAPI]
95+
public static Task<dynamic> FirstInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
96+
{
97+
string predicateStr = ParseFormattableString(predicate, out object[] args);
98+
return EntityFrameworkDynamicQueryableExtensions.FirstAsync(source, predicateStr, args);
99+
}
100+
101+
[PublicAPI]
102+
public static Task<dynamic> FirstInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
103+
{
104+
string predicateStr = ParseFormattableString(predicate, out object[] args);
105+
return EntityFrameworkDynamicQueryableExtensions.FirstAsync(source, cancellationToken, predicateStr, args);
106+
}
107+
108+
[PublicAPI]
109+
public static Task<dynamic> FirstOrDefaultInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
110+
{
111+
string predicateStr = ParseFormattableString(predicate, out object[] args);
112+
return EntityFrameworkDynamicQueryableExtensions.FirstOrDefaultAsync(source, predicateStr, args);
113+
}
114+
115+
[PublicAPI]
116+
public static Task<dynamic> FirstOrDefaultInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
117+
{
118+
string predicateStr = ParseFormattableString(predicate, out object[] args);
119+
return EntityFrameworkDynamicQueryableExtensions.FirstOrDefaultAsync(source, cancellationToken, predicateStr, args);
120+
}
121+
122+
[PublicAPI]
123+
public static Task<dynamic> LastInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
124+
{
125+
string predicateStr = ParseFormattableString(predicate, out object[] args);
126+
return EntityFrameworkDynamicQueryableExtensions.LastAsync(source, predicateStr, args);
127+
}
128+
129+
[PublicAPI]
130+
public static Task<dynamic> LastInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
131+
{
132+
string predicateStr = ParseFormattableString(predicate, out object[] args);
133+
return EntityFrameworkDynamicQueryableExtensions.LastAsync(source, cancellationToken, predicateStr, args);
134+
}
135+
136+
[PublicAPI]
137+
public static Task<dynamic> LastOrDefaultInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
138+
{
139+
string predicateStr = ParseFormattableString(predicate, out object[] args);
140+
return EntityFrameworkDynamicQueryableExtensions.LastOrDefaultAsync(source, predicateStr, args);
141+
}
142+
143+
[PublicAPI]
144+
public static Task<dynamic> LastOrDefaultInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
145+
{
146+
string predicateStr = ParseFormattableString(predicate, out object[] args);
147+
return EntityFrameworkDynamicQueryableExtensions.LastOrDefaultAsync(source, cancellationToken, predicateStr, args);
148+
}
149+
150+
[PublicAPI]
151+
public static Task<long> LongCountInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
152+
{
153+
string predicateStr = ParseFormattableString(predicate, out object[] args);
154+
return EntityFrameworkDynamicQueryableExtensions.LongCountAsync(source, predicateStr, args);
155+
}
156+
157+
[PublicAPI]
158+
public static Task<long> LongCountInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
159+
{
160+
string predicateStr = ParseFormattableString(predicate, out object[] args);
161+
return EntityFrameworkDynamicQueryableExtensions.LongCountAsync(source, cancellationToken, predicateStr, args);
162+
}
163+
164+
[PublicAPI]
165+
public static Task<dynamic> SingleOrDefaultInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString predicate)
166+
{
167+
string predicateStr = ParseFormattableString(predicate, out object[] args);
168+
return EntityFrameworkDynamicQueryableExtensions.SingleOrDefaultAsync(source, predicateStr, args);
169+
}
170+
171+
[PublicAPI]
172+
public static Task<dynamic> SingleOrDefaultInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString predicate)
173+
{
174+
string predicateStr = ParseFormattableString(predicate, out object[] args);
175+
return EntityFrameworkDynamicQueryableExtensions.SingleOrDefaultAsync(source, cancellationToken, predicateStr, args);
176+
}
177+
178+
[PublicAPI]
179+
public static Task<dynamic> SumInterpolatedAsync([NotNull] this IQueryable source, [NotNull] FormattableString selector)
180+
{
181+
string selectorStr = ParseFormattableString(selector, out object[] args);
182+
return EntityFrameworkDynamicQueryableExtensions.SumAsync(source, selectorStr, args);
183+
}
184+
185+
[PublicAPI]
186+
public static Task<dynamic> SumInterpolatedAsync([NotNull] this IQueryable source, CancellationToken cancellationToken, [NotNull] FormattableString selector)
187+
{
188+
string selectorStr = ParseFormattableString(selector, out object[] args);
189+
return EntityFrameworkDynamicQueryableExtensions.SumAsync(source, cancellationToken, selectorStr, args);
190+
}
191+
192+
}
193+
#endif
194+
}

0 commit comments

Comments
 (0)