mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 20:38:16 +08:00
- 增加 ISelect Cancel 用于取消本次查询;
- 增加 IncludeIf/IncludeByPropertyNameIf 方法;
This commit is contained in:
@ -42,6 +42,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
public bool _distinct;
|
||||
public Expression _selectExpression;
|
||||
public List<GlobalFilter.Item> _whereGlobalFilter;
|
||||
public Func<bool> _cancel;
|
||||
|
||||
int _disposeCounter;
|
||||
~Select0Provider()
|
||||
@ -61,6 +62,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_includeInfo.Clear();
|
||||
_selectExpression = null;
|
||||
_whereGlobalFilter?.Clear();
|
||||
_cancel = null;
|
||||
}
|
||||
|
||||
public static void CopyData(Select0Provider from, Select0Provider to, ReadOnlyCollection<ParameterExpression> lambParms)
|
||||
@ -119,6 +121,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
to._distinct = from._distinct;
|
||||
to._selectExpression = from._selectExpression;
|
||||
to._whereGlobalFilter = new List<GlobalFilter.Item>(from._whereGlobalFilter.ToArray());
|
||||
to._cancel = from._cancel;
|
||||
}
|
||||
|
||||
public Expression ConvertStringPropertyToExpression(string property, bool fromFirstTable = false)
|
||||
@ -183,6 +186,12 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return this as TSelect;
|
||||
}
|
||||
|
||||
public TSelect Cancel(Func<bool> cancel)
|
||||
{
|
||||
_cancel = cancel;
|
||||
return this as TSelect;
|
||||
}
|
||||
|
||||
public TSelect WithTransaction(DbTransaction transaction)
|
||||
{
|
||||
_transaction = transaction;
|
||||
|
@ -21,11 +21,12 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
public DataTable ToDataTable(string field = null)
|
||||
{
|
||||
DataTable ret = null;
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.ToSql(field);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
DataTable ret = null;
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -46,12 +47,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
public List<TTuple> ToList<TTuple>(string field)
|
||||
{
|
||||
var ret = new List<TTuple>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.ToSql(field);
|
||||
var type = typeof(TTuple);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new List<TTuple>();
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -81,10 +83,11 @@ namespace FreeSql.Internal.CommonProvider
|
||||
}
|
||||
internal List<T1> ToListAfPrivate(string sql, GetAllFieldExpressionTreeInfo af, ReadAnonymousTypeOtherInfo[] otherData)
|
||||
{
|
||||
var ret = new List<T1>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new List<T1>();
|
||||
var retCount = 0;
|
||||
Exception exception = null;
|
||||
try
|
||||
@ -133,6 +136,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
#region ToChunk
|
||||
internal void ToListAfChunkPrivate(int chunkSize, Action<FetchCallbackArgs<List<T1>>> chunkDone, string sql, GetAllFieldExpressionTreeInfo af, ReadAnonymousTypeOtherInfo[] otherData)
|
||||
{
|
||||
if (_cancel?.Invoke() == true) return;
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
@ -208,6 +212,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
internal void ToListMrChunkPrivate<TReturn>(int chunkSize, Action<FetchCallbackArgs<List<TReturn>>> chunkDone, string sql, ReadAnonymousTypeAfInfo af)
|
||||
{
|
||||
if (_cancel?.Invoke() == true) return;
|
||||
var type = typeof(TReturn);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
@ -266,12 +271,14 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
|
||||
if (elementSelector == null) throw new ArgumentNullException(nameof(elementSelector));
|
||||
|
||||
var ret = new Dictionary<TKey, TElement>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var af = this.GetAllFieldExpressionTreeLevel2();
|
||||
var sql = this.ToSql(af.Field);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new Dictionary<TKey, TElement>();
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -297,11 +304,12 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
internal List<TReturn> ToListMrPrivate<TReturn>(string sql, ReadAnonymousTypeAfInfo af, ReadAnonymousTypeOtherInfo[] otherData)
|
||||
{
|
||||
var ret = new List<TReturn>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var type = typeof(TReturn);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new List<TReturn>();
|
||||
var retCount = 0;
|
||||
Exception exception = null;
|
||||
try
|
||||
@ -715,12 +723,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
}
|
||||
public int InternalInsertInto<TTargetEntity>(string tableName, Expression select)
|
||||
{
|
||||
int ret = 0;
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.InternalGetInsertIntoToSql<TTargetEntity>(tableName, select);
|
||||
var dbParms = _params.ToArray();
|
||||
var tb = _orm.CodeFirst.GetTableByEntity(typeof(TTargetEntity));
|
||||
var before = new Aop.CurdBeforeEventArgs(tb.Type, tb, Aop.CurdType.Insert, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
int ret = 0;
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -741,11 +750,12 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
protected DataTable InternalToDataTable(Expression select)
|
||||
{
|
||||
DataTable ret = null;
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.InternalToSql<int>(select, FieldAliasOptions.AsProperty); //DataTable 使用 AsProperty
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
DataTable ret = null;
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -790,11 +800,12 @@ namespace FreeSql.Internal.CommonProvider
|
||||
#else
|
||||
async public Task<DataTable> ToDataTableAsync(string field, CancellationToken cancellationToken)
|
||||
{
|
||||
DataTable ret = null;
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.ToSql(field);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
DataTable ret = null;
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -815,12 +826,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
async public Task<List<TTuple>> ToListAsync<TTuple>(string field, CancellationToken cancellationToken)
|
||||
{
|
||||
var ret = new List<TTuple>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.ToSql(field);
|
||||
var type = typeof(TTuple);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new List<TTuple>();
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -852,10 +864,11 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
async internal Task<List<T1>> ToListAfPrivateAsync(string sql, GetAllFieldExpressionTreeInfo af, ReadAnonymousTypeOtherInfo[] otherData, CancellationToken cancellationToken)
|
||||
{
|
||||
var ret = new List<T1>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new List<T1>();
|
||||
var retCount = 0;
|
||||
Exception exception = null;
|
||||
try
|
||||
@ -909,12 +922,14 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
|
||||
if (elementSelector == null) throw new ArgumentNullException(nameof(elementSelector));
|
||||
|
||||
var ret = new Dictionary<TKey, TElement>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var af = this.GetAllFieldExpressionTreeLevel2();
|
||||
var sql = this.ToSql(af.Field);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new Dictionary<TKey, TElement>();
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -941,11 +956,12 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
async internal Task<List<TReturn>> ToListMrPrivateAsync<TReturn>(string sql, ReadAnonymousTypeAfInfo af, ReadAnonymousTypeOtherInfo[] otherData, CancellationToken cancellationToken)
|
||||
{
|
||||
var ret = new List<TReturn>();
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var type = typeof(TReturn);
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new List<TReturn>();
|
||||
var retCount = 0;
|
||||
Exception exception = null;
|
||||
try
|
||||
@ -1006,12 +1022,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
async public Task<int> InternalInsertIntoAsync<TTargetEntity>(string tableName, Expression select, CancellationToken cancellationToken)
|
||||
{
|
||||
int ret = 0;
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.InternalGetInsertIntoToSql<TTargetEntity>(tableName, select);
|
||||
var dbParms = _params.ToArray();
|
||||
var tb = _orm.CodeFirst.GetTableByEntity(typeof(TTargetEntity));
|
||||
var before = new Aop.CurdBeforeEventArgs(tb.Type, tb, Aop.CurdType.Insert, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
int ret = 0;
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
@ -1032,11 +1049,12 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
async protected Task<DataTable> InternalToDataTableAsync(Expression select, CancellationToken cancellationToken)
|
||||
{
|
||||
DataTable ret = null;
|
||||
if (_cancel?.Invoke() == true) return ret;
|
||||
var sql = this.InternalToSql<int>(select, FieldAliasOptions.AsProperty); //DataTable 使用 AsProperty
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
DataTable ret = null;
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
|
@ -393,6 +393,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
public int InsertInto<TTargetEntity>(string tableName, Expression<Func<T1, TTargetEntity>> select) where TTargetEntity : class => base.InternalInsertInto<TTargetEntity>(tableName, select);
|
||||
|
||||
public ISelect<T1> IncludeByPropertyNameIf(bool condition, string property) => condition ? IncludeByPropertyName(property) : this;
|
||||
public ISelect<T1> IncludeByPropertyName(string property)
|
||||
{
|
||||
var exp = ConvertStringPropertyToExpression(property, true);
|
||||
@ -424,6 +425,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
}
|
||||
|
||||
bool _isIncluded = false;
|
||||
public ISelect<T1> IncludeIf<TNavigate>(bool condition, Expression<Func<T1, TNavigate>> navigateSelector) where TNavigate : class => condition ? Include(navigateSelector) : this;
|
||||
public ISelect<T1> Include<TNavigate>(Expression<Func<T1, TNavigate>> navigateSelector) where TNavigate : class
|
||||
{
|
||||
var expBody = navigateSelector?.Body;
|
||||
|
@ -171,7 +171,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return this;
|
||||
}
|
||||
|
||||
public long Count() => long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_select._connection, _select._transaction, CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._commandTimeout, _select._params.ToArray())), out var trylng) ? trylng : default(long);
|
||||
public long Count() => _select._cancel?.Invoke() == true ? 0 : long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_select._connection, _select._transaction, CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._commandTimeout, _select._params.ToArray())), out var trylng) ? trylng : default(long);
|
||||
public ISelectGrouping<TKey, TValue> Count(out long count)
|
||||
{
|
||||
count = this.Count();
|
||||
@ -200,7 +200,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
#if net40
|
||||
#else
|
||||
async public Task<long> CountAsync(CancellationToken cancellationToken = default) => long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_select._connection, _select._transaction, CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._commandTimeout, _select._params.ToArray(), cancellationToken)), out var trylng) ? trylng : default(long);
|
||||
async public Task<long> CountAsync(CancellationToken cancellationToken = default) => _select._cancel?.Invoke() == true ? 0 : long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_select._connection, _select._transaction, CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._commandTimeout, _select._params.ToArray(), cancellationToken)), out var trylng) ? trylng : default(long);
|
||||
|
||||
public Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select, CancellationToken cancellationToken = default)
|
||||
{
|
||||
|
Reference in New Issue
Block a user