Skip to content

Commit 2febee8

Browse files
Ihar YakimushIhar Yakimush
authored andcommitted
rework handling enumerating result
1 parent e075757 commit 2febee8

File tree

4 files changed

+55
-31
lines changed

4 files changed

+55
-31
lines changed

SolrNet.Linq/SolrLinqExtensions.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public static async Task<TSource> FirstAsync<TSource>(this IQueryable<TSource> q
1818
GetMethod<TSource>(nameof(Queryable.First), 1),
1919
query.Expression);
2020

21-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(mce);
21+
TSource result = await provider.ExecuteAsync<TSource>(mce);
2222

23-
return result.First();
23+
return result;
2424
}
2525

2626
return query.First();
@@ -30,11 +30,11 @@ public static async Task<TSource> FirstAsync<TSource>(this IQueryable<TSource> q
3030
{
3131
if (query.Provider is SolrQueryProvider<TSource> provider)
3232
{
33-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(Expression.Call(
33+
TSource result = await provider.ExecuteAsync<TSource>(Expression.Call(
3434
null,
3535
GetMethod<TSource>(nameof(Queryable.First), 2), query.Expression, predicate));
3636

37-
return result.First();
37+
return result;
3838
}
3939

4040
return query.First(predicate);
@@ -44,11 +44,11 @@ public static async Task<TSource> FirstOrDefaultAsync<TSource>(this IQueryable<T
4444
{
4545
if (query.Provider is SolrQueryProvider<TSource> provider)
4646
{
47-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(Expression.Call(
47+
TSource result = await provider.ExecuteAsync<TSource>(Expression.Call(
4848
null,
4949
GetMethod<TSource>(nameof(Queryable.FirstOrDefault), 1), query.Expression));
5050

51-
return result.FirstOrDefault();
51+
return result;
5252
}
5353

5454
return query.FirstOrDefault();
@@ -58,11 +58,11 @@ public static async Task<TSource> FirstOrDefaultAsync<TSource>(this IQueryable<T
5858
{
5959
if (query.Provider is SolrQueryProvider<TSource> provider)
6060
{
61-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(Expression.Call(
61+
TSource result = await provider.ExecuteAsync<TSource>(Expression.Call(
6262
null,
6363
GetMethod<TSource>(nameof(Queryable.FirstOrDefault), 2), query.Expression, predicate));
6464

65-
return result.FirstOrDefault();
65+
return result;
6666
}
6767

6868
return query.FirstOrDefault(predicate);
@@ -72,11 +72,11 @@ public static async Task<TSource> SingleAsync<TSource>(this IQueryable<TSource>
7272
{
7373
if (query.Provider is SolrQueryProvider<TSource> provider)
7474
{
75-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(Expression.Call(
75+
TSource result = await provider.ExecuteAsync<TSource>(Expression.Call(
7676
null,
7777
GetMethod<TSource>(nameof(Queryable.Single), 1), query.Expression));
7878

79-
return result.Single();
79+
return result;
8080
}
8181

8282
return query.Single();
@@ -86,11 +86,11 @@ public static async Task<TSource> SingleAsync<TSource>(this IQueryable<TSource>
8686
{
8787
if (query.Provider is SolrQueryProvider<TSource> provider)
8888
{
89-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(Expression.Call(
89+
TSource result = await provider.ExecuteAsync<TSource>(Expression.Call(
9090
null,
9191
GetMethod<TSource>(nameof(Queryable.Single), 2), query.Expression, predicate));
9292

93-
return result.Single();
93+
return result;
9494
}
9595

9696
return query.Single(predicate);
@@ -100,11 +100,11 @@ public static async Task<TSource> SingleOrDefaultAsync<TSource>(this IQueryable<
100100
{
101101
if (query.Provider is SolrQueryProvider<TSource> provider)
102102
{
103-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(Expression.Call(
103+
TSource result = await provider.ExecuteAsync<TSource>(Expression.Call(
104104
null,
105105
GetMethod<TSource>(nameof(Queryable.SingleOrDefault), 1), query.Expression));
106106

107-
return result.SingleOrDefault();
107+
return result;
108108
}
109109

110110
return query.SingleOrDefault();
@@ -114,11 +114,11 @@ public static async Task<TSource> SingleOrDefaultAsync<TSource>(this IQueryable<
114114
{
115115
if (query.Provider is SolrQueryProvider<TSource> provider)
116116
{
117-
SolrQueryResults<TSource> result = await provider.ExecuteAsync(Expression.Call(
117+
TSource result = await provider.ExecuteAsync<TSource>(Expression.Call(
118118
null,
119119
GetMethod<TSource>(nameof(Queryable.SingleOrDefault), 2), query.Expression, predicate));
120120

121-
return result.SingleOrDefault();
121+
return result;
122122
}
123123

124124
return query.SingleOrDefault(predicate);

SolrNet.Linq/SolrNet.Linq.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<PackageTags>solr solrnet linq</PackageTags>
1313
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1414
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
15-
<Version>1.2.0</Version>
15+
<Version>1.2.1</Version>
1616
<PackageReleaseNotes>support First(), FirstOrDefault(). Single(), SingleOrDefault() methods and its async versions</PackageReleaseNotes>
1717
</PropertyGroup>
1818

SolrNet.Linq/SolrOperationsExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ public static SolrQuery<T> AsQueryable<T>(this ISolrBasicReadOnlyOperations<T> o
1717

1818
public static SolrQueryResults<T> ToSolrQueryResults<T>(this IQueryable<T> queryable)
1919
{
20-
return queryable.Provider.Execute(queryable.Expression) as SolrQueryResults<T>;
20+
return (SolrQueryResults<T>)queryable.Provider.Execute(queryable.Expression);
2121
}
2222

2323
public static Task<SolrQueryResults<T>> ToSolrQueryResultsAsync<T>(this IQueryable<T> queryable)
2424
{
2525
if (queryable.Provider is SolrQueryProvider<T> solrProvider)
2626
{
27-
return solrProvider.ExecuteAsync(queryable.Expression);
27+
return solrProvider.ExecuteAsync<SolrQueryResults<T>>(queryable.Expression);
2828
}
2929

3030
return Task.FromResult(ToSolrQueryResults(queryable));

SolrNet.Linq/SolrQueryProvider.cs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,16 @@ public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
5151

5252
public object Execute(Expression expression)
5353
{
54-
SolrQueryTranslator translator = new SolrQueryTranslator(this.Options, this.MemberContext);
55-
Tuple<ISolrQuery, QueryOptions, EnumeratedResult> result = translator.Translate(this, expression);
56-
this.Options.SetupQueryOptions?.Invoke(result.Item2);
54+
Tuple<ISolrQuery, QueryOptions, EnumeratedResult> result = Translate(expression);
55+
5756
SolrQueryResults<TEntity> solrQueryResults =
5857
Operations.Query(this.Options.MainQuery ?? result.Item1, result.Item2);
5958

59+
return HandleResults(result, solrQueryResults);
60+
}
61+
62+
private static object HandleResults(Tuple<ISolrQuery, QueryOptions, EnumeratedResult> result, SolrQueryResults<TEntity> solrQueryResults)
63+
{
6064
switch (result.Item3)
6165
{
6266
case EnumeratedResult.First: return solrQueryResults.First();
@@ -68,6 +72,14 @@ public object Execute(Expression expression)
6872
}
6973
}
7074

75+
private Tuple<ISolrQuery, QueryOptions, EnumeratedResult> Translate(Expression expression)
76+
{
77+
SolrQueryTranslator translator = new SolrQueryTranslator(this.Options, this.MemberContext);
78+
Tuple<ISolrQuery, QueryOptions, EnumeratedResult> result = translator.Translate(this, expression);
79+
this.Options.SetupQueryOptions?.Invoke(result.Item2);
80+
return result;
81+
}
82+
7183
public MemberContext MemberContext
7284
{
7385
get
@@ -79,25 +91,37 @@ public MemberContext MemberContext
7991
}
8092
}
8193

82-
public Task<SolrQueryResults<TEntity>> ExecuteAsync(Expression expression)
94+
public async Task<object> ExecuteAsync(Expression expression)
8395
{
84-
SolrQueryTranslator
85-
translator = new SolrQueryTranslator(this.Options, this.MemberContext);
86-
var result = translator.Translate(this, expression);
87-
this.Options.SetupQueryOptions?.Invoke(result.Item2);
88-
89-
return Operations.QueryAsync(this.Options.MainQuery ?? result.Item1, result.Item2);
96+
Tuple<ISolrQuery, QueryOptions, EnumeratedResult> result = Translate(expression);
97+
98+
SolrQueryResults<TEntity> solrQueryResults =
99+
await Operations.QueryAsync(this.Options.MainQuery ?? result.Item1, result.Item2);
100+
101+
return HandleResults(result, solrQueryResults);
90102
}
91103

92104
public TResult Execute<TResult>(Expression expression)
93105
{
94106
object providerResult = this.Execute(expression);
95107

108+
return CastResult<TResult>(providerResult);
109+
}
110+
111+
public async Task<TResult> ExecuteAsync<TResult>(Expression expression)
112+
{
113+
object providerResult = await this.ExecuteAsync(expression);
114+
115+
return CastResult<TResult>(providerResult);
116+
}
117+
118+
private static TResult CastResult<TResult>(object providerResult)
119+
{
96120
TResult result = default(TResult);
97121

98122
try
99123
{
100-
result = (TResult)providerResult;
124+
result = (TResult) providerResult;
101125
}
102126
catch (InvalidCastException exception)
103127
{
@@ -110,6 +134,6 @@ public TResult Execute<TResult>(Expression expression)
110134
}
111135

112136
return result;
113-
}
137+
}
114138
}
115139
}

0 commit comments

Comments
 (0)