efcore2下修复iasyncenumerable的current报错问题
This commit is contained in:
parent
3aec0399d0
commit
85f854577d
|
@ -1,8 +1,8 @@
|
|||
:start
|
||||
::定义版本
|
||||
set EFCORE2=2.2.0.21
|
||||
set EFCORE3=3.2.0.21
|
||||
set EFCORE5=5.2.0.21
|
||||
set EFCORE2=2.2.0.22-efcore2.1.0
|
||||
set EFCORE3=3.2.0.22
|
||||
set EFCORE5=5.2.0.22
|
||||
|
||||
::删除所有bin与obj下的文件
|
||||
@echo off
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ShardingCore.Sharding.Enumerators.StreamMergeAsync.EFCore2x
|
||||
{
|
||||
/*
|
||||
* @Author: xjm
|
||||
* @Description:
|
||||
* @Date: 2021/9/29 14:11:30
|
||||
* @Ver: 1.0
|
||||
* @Email: 326308290@qq.com
|
||||
*/
|
||||
#if EFCORE2
|
||||
public class EFCore2TryCurrentAsyncEnumerator<T>:IAsyncEnumerator<T>
|
||||
{
|
||||
private readonly IAsyncEnumerator<T> _asyncEnumerator;
|
||||
private bool currentMoved=false;
|
||||
|
||||
public EFCore2TryCurrentAsyncEnumerator(IAsyncEnumerator<T> asyncEnumerator)
|
||||
{
|
||||
_asyncEnumerator = asyncEnumerator;
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
_asyncEnumerator?.Dispose();
|
||||
}
|
||||
|
||||
public async Task<bool> MoveNext(CancellationToken cancellationToken)
|
||||
{
|
||||
var moveNext = await _asyncEnumerator.MoveNext(cancellationToken);
|
||||
currentMoved = moveNext;
|
||||
return moveNext;
|
||||
}
|
||||
|
||||
public T Current => currentMoved ? _asyncEnumerator.Current : default;
|
||||
}
|
||||
#endif
|
||||
}
|
|
@ -6,12 +6,6 @@ using System.Threading.Tasks;
|
|||
|
||||
namespace ShardingCore.Sharding.Enumerators
|
||||
{
|
||||
/*
|
||||
* @Author: xjm
|
||||
* @Description:
|
||||
* @Date: Saturday, 14 August 2021 21:25:50
|
||||
* @Email: 326308290@qq.com
|
||||
*/
|
||||
public class StreamMergeAsyncEnumerator<T> : IStreamMergeAsyncEnumerator<T>
|
||||
{
|
||||
private readonly IAsyncEnumerator<T> _asyncSource;
|
||||
|
@ -22,6 +16,7 @@ namespace ShardingCore.Sharding.Enumerators
|
|||
{
|
||||
if (_syncSource != null)
|
||||
throw new ArgumentNullException(nameof(_syncSource));
|
||||
|
||||
_asyncSource = asyncSource;
|
||||
skip = true;
|
||||
}
|
||||
|
@ -60,18 +55,38 @@ namespace ShardingCore.Sharding.Enumerators
|
|||
return await _asyncSource.MoveNextAsync();
|
||||
}
|
||||
|
||||
public T Current => GetCurrent();
|
||||
public T ReallyCurrent => GetReallyCurrent();
|
||||
public void Dispose()
|
||||
{
|
||||
_syncSource?.Dispose();
|
||||
}
|
||||
|
||||
#endif
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (skip)
|
||||
{
|
||||
skip = false;
|
||||
return null != _syncSource.Current;
|
||||
}
|
||||
return _syncSource.MoveNext();
|
||||
}
|
||||
|
||||
public bool HasElement()
|
||||
{
|
||||
if (_asyncSource != null) return null != _asyncSource.Current;
|
||||
if (_syncSource != null) return null != _syncSource.Current;
|
||||
return false;
|
||||
}
|
||||
public void Dispose()
|
||||
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
_syncSource?.Dispose();
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
object IEnumerator.Current => Current;
|
||||
public T Current => GetCurrent();
|
||||
public T ReallyCurrent => GetReallyCurrent();
|
||||
public T GetCurrent()
|
||||
{
|
||||
if (skip)
|
||||
|
@ -86,26 +101,6 @@ namespace ShardingCore.Sharding.Enumerators
|
|||
if (_syncSource != null) return _syncSource.Current;
|
||||
return default;
|
||||
}
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (skip)
|
||||
{
|
||||
skip = false;
|
||||
return null != _syncSource.Current;
|
||||
}
|
||||
return _syncSource.MoveNext();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
object IEnumerator.Current => Current;
|
||||
#if EFCORE2
|
||||
public void Dispose()
|
||||
{
|
||||
|
@ -118,61 +113,11 @@ namespace ShardingCore.Sharding.Enumerators
|
|||
if (skip)
|
||||
{
|
||||
skip = false;
|
||||
return null != SourceCurrent();
|
||||
return null != _asyncSource.Current;
|
||||
}
|
||||
return await _asyncSource.MoveNext(cancellationToken);
|
||||
}
|
||||
public T Current => GetCurrent();
|
||||
public T ReallyCurrent => GetReallyCurrent();
|
||||
public bool HasElement()
|
||||
{
|
||||
return null != SourceCurrent();
|
||||
}
|
||||
|
||||
private T SourceCurrent()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (tryGetCurrentError)
|
||||
return default;
|
||||
if (_asyncSource!= null)
|
||||
return _asyncSource.Current;
|
||||
if (_syncSource != null)
|
||||
return _syncSource.Current;
|
||||
return default;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
tryGetCurrentError = true;
|
||||
return default;
|
||||
}
|
||||
}
|
||||
|
||||
private bool tryGetCurrentError = false;
|
||||
|
||||
public T GetCurrent()
|
||||
{
|
||||
if (skip)
|
||||
return default;
|
||||
if (_asyncSource != null) return SourceCurrent();
|
||||
if (_syncSource != null) return _syncSource.Current;
|
||||
return default;
|
||||
}
|
||||
public T GetReallyCurrent()
|
||||
{
|
||||
if (_asyncSource != null) return SourceCurrent();
|
||||
if (_syncSource != null) return _syncSource.Current;
|
||||
return default;
|
||||
}
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (skip)
|
||||
{
|
||||
skip = false;
|
||||
return null != _syncSource.Current;
|
||||
}
|
||||
return _syncSource.MoveNext();
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ using ShardingCore.Exceptions;
|
|||
using ShardingCore.Extensions;
|
||||
using ShardingCore.Sharding.Enumerators;
|
||||
using ShardingCore.Sharding.Enumerators.StreamMergeAsync;
|
||||
using ShardingCore.Sharding.Enumerators.StreamMergeAsync.EFCore2x;
|
||||
#if EFCORE2
|
||||
using Microsoft.EntityFrameworkCore.Extensions.Internal;
|
||||
#endif
|
||||
|
@ -66,7 +67,8 @@ namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.
|
|||
return enumator;
|
||||
#endif
|
||||
#if EFCORE2
|
||||
var enumator = newQueryable.AsAsyncEnumerable().GetEnumerator();
|
||||
var enumator =
|
||||
new EFCore2TryCurrentAsyncEnumerator<TEntity>(newQueryable.AsAsyncEnumerable().GetEnumerator());
|
||||
await enumator.MoveNext();
|
||||
return enumator;
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue