mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-03-16 19:10:58 +08:00
- 调整 ISelect linq to sql 和 queryable 实现依赖移至 FreeSql.Extensions.Linq;#260
This commit is contained in:
@@ -111,15 +111,15 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return this.InternalAvg(column?.Body);
|
||||
}
|
||||
|
||||
public abstract ISelect<T1, T2> From<T2>(Expression<Func<ISelectFromExpression<T1>, T2, ISelectFromExpression<T1>>> exp) where T2 : class;// { this.InternalFrom(exp); var ret = new Select3Provider<T1, T2, T3>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3> From<T2, T3>(Expression<Func<ISelectFromExpression<T1>, T2, T3, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class;// { this.InternalFrom(exp); var ret = new Select3Provider<T1, T2, T3>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3, T4> From<T2, T3, T4>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class;// { this.InternalFrom(exp); var ret = new Select4Provider<T1, T2, T3, T4>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3, T4, T5> From<T2, T3, T4, T5>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class;// { this.InternalFrom(exp); var ret = new Select5Provider<T1, T2, T3, T4, T5>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6> From<T2, T3, T4, T5, T6>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class;// { this.InternalFrom(exp); var ret = new Select6Provider<T1, T2, T3, T4, T5, T6>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7> From<T2, T3, T4, T5, T6, T7>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class;// { this.InternalFrom(exp); var ret = new Select7Provider<T1, T2, T3, T4, T5, T6, T7>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class;// { this.InternalFrom(exp); var ret = new Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class;// { this.InternalFrom(exp); var ret = new Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class;// { this.InternalFrom(exp); var ret = new Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
|
||||
public abstract ISelect<T1, T2> From<T2>(Expression<Func<ISelectFromExpression<T1>, T2, ISelectFromExpression<T1>>> exp) where T2 : class;
|
||||
public abstract ISelect<T1, T2, T3> From<T2, T3>(Expression<Func<ISelectFromExpression<T1>, T2, T3, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class;
|
||||
public abstract ISelect<T1, T2, T3, T4> From<T2, T3, T4>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class;
|
||||
public abstract ISelect<T1, T2, T3, T4, T5> From<T2, T3, T4, T5>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class;
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6> From<T2, T3, T4, T5, T6>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class;
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7> From<T2, T3, T4, T5, T6, T7>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class;
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class;
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class;
|
||||
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class;
|
||||
|
||||
public ISelectGrouping<TKey, T1> GroupBy<TKey>(Expression<Func<T1, TKey>> columns)
|
||||
{
|
||||
@@ -132,41 +132,48 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
if (column == null) return default(TMember);
|
||||
_tables[0].Parameter = column.Parameters[0];
|
||||
return this.InternalMax<TMember>(column?.Body);
|
||||
return this.InternalMax<TMember>(column.Body);
|
||||
}
|
||||
public TMember Min<TMember>(Expression<Func<T1, TMember>> column)
|
||||
{
|
||||
if (column == null) return default(TMember);
|
||||
_tables[0].Parameter = column.Parameters[0];
|
||||
return this.InternalMin<TMember>(column?.Body);
|
||||
return this.InternalMin<TMember>(column.Body);
|
||||
}
|
||||
public void OrderByReflection(LambdaExpression column, bool isDescending)
|
||||
{
|
||||
if (column == null) return;
|
||||
_tables[0].Parameter = column.Parameters[0];
|
||||
if (isDescending) this.InternalOrderByDescending(column.Body);
|
||||
else this.InternalOrderBy(column.Body);
|
||||
}
|
||||
public ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column) => this.OrderBy(true, column);
|
||||
public ISelect<T1> OrderBy<TMember>(bool condition, Expression<Func<T1, TMember>> column)
|
||||
{
|
||||
if (condition == false || column == null) return this;
|
||||
_tables[0].Parameter = column.Parameters[0];
|
||||
return this.InternalOrderBy(column?.Body);
|
||||
return this.InternalOrderBy(column.Body);
|
||||
}
|
||||
public ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column) => this.OrderByDescending(true, column);
|
||||
public ISelect<T1> OrderByDescending<TMember>(bool condition, Expression<Func<T1, TMember>> column)
|
||||
{
|
||||
if (condition == false || column == null) return this;
|
||||
_tables[0].Parameter = column.Parameters[0];
|
||||
return this.InternalOrderByDescending(column?.Body);
|
||||
return this.InternalOrderByDescending(column.Body);
|
||||
}
|
||||
|
||||
public decimal Sum<TMember>(Expression<Func<T1, TMember>> column)
|
||||
{
|
||||
if (column == null) return default(decimal);
|
||||
_tables[0].Parameter = column.Parameters[0];
|
||||
return this.InternalSum(column?.Body);
|
||||
return this.InternalSum(column.Body);
|
||||
}
|
||||
|
||||
public List<TReturn> ToList<TReturn>(Expression<Func<T1, TReturn>> select)
|
||||
{
|
||||
if (select == null) return this.InternalToList<TReturn>(select?.Body);
|
||||
_tables[0].Parameter = select.Parameters[0];
|
||||
return this.InternalToList<TReturn>(select?.Body);
|
||||
return this.InternalToList<TReturn>(select.Body);
|
||||
}
|
||||
|
||||
public List<TDto> ToList<TDto>() => ToList(GetToListDtoSelector<TDto>());
|
||||
@@ -177,89 +184,6 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"));
|
||||
}
|
||||
|
||||
#region linq to sql
|
||||
public ISelect<TReturn> Select<TReturn>(Expression<Func<T1, TReturn>> select) where TReturn : class
|
||||
{
|
||||
if (typeof(TReturn) == typeof(T1)) return this as ISelect<TReturn>;
|
||||
_tables[0].Parameter = select.Parameters[0];
|
||||
_selectExpression = select.Body;
|
||||
if (_orm.CodeFirst.IsAutoSyncStructure)
|
||||
(_orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(typeof(TReturn)); //._dicSyced.TryAdd(typeof(TReturn), true);
|
||||
var ret = _orm.Select<TReturn>();
|
||||
Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, null);
|
||||
return ret;
|
||||
}
|
||||
public ISelect<TResult> Join<TInner, TKey, TResult>(ISelect<TInner> inner, Expression<Func<T1, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<T1, TInner, TResult>> resultSelector) where TInner : class where TResult : class
|
||||
{
|
||||
_tables[0].Parameter = resultSelector.Parameters[0];
|
||||
_commonExpression.ExpressionLambdaToSql(outerKeySelector, new CommonExpression.ExpTSC { _tables = _tables });
|
||||
this.InternalJoin(Expression.Lambda<Func<T1, TInner, bool>>(
|
||||
Expression.Equal(outerKeySelector.Body, innerKeySelector.Body),
|
||||
new[] { outerKeySelector.Parameters[0], innerKeySelector.Parameters[0] }
|
||||
), SelectTableInfoType.InnerJoin);
|
||||
if (typeof(TResult) == typeof(T1)) return this as ISelect<TResult>;
|
||||
_selectExpression = resultSelector.Body;
|
||||
if (_orm.CodeFirst.IsAutoSyncStructure)
|
||||
(_orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(typeof(TResult)); //._dicSyced.TryAdd(typeof(TResult), true);
|
||||
var ret = _orm.Select<TResult>() as Select1Provider<TResult>;
|
||||
Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, null);
|
||||
return ret;
|
||||
}
|
||||
public ISelect<TResult> GroupJoin<TInner, TKey, TResult>(ISelect<TInner> inner, Expression<Func<T1, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<T1, ISelect<TInner>, TResult>> resultSelector) where TInner : class where TResult : class
|
||||
{
|
||||
_tables[0].Parameter = resultSelector.Parameters[0];
|
||||
_commonExpression.ExpressionLambdaToSql(outerKeySelector, new CommonExpression.ExpTSC { _tables = _tables });
|
||||
this.InternalJoin(Expression.Lambda<Func<T1, TInner, bool>>(
|
||||
Expression.Equal(outerKeySelector.Body, innerKeySelector.Body),
|
||||
new[] { outerKeySelector.Parameters[0], innerKeySelector.Parameters[0] }
|
||||
), SelectTableInfoType.InnerJoin);
|
||||
if (typeof(TResult) == typeof(T1)) return this as ISelect<TResult>;
|
||||
_selectExpression = resultSelector.Body;
|
||||
if (_orm.CodeFirst.IsAutoSyncStructure)
|
||||
(_orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(typeof(TResult)); //._dicSyced.TryAdd(typeof(TResult), true);
|
||||
var ret = _orm.Select<TResult>() as Select1Provider<TResult>;
|
||||
Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, null);
|
||||
return ret;
|
||||
}
|
||||
public ISelect<TResult> SelectMany<TCollection, TResult>(Expression<Func<T1, ISelect<TCollection>>> collectionSelector, Expression<Func<T1, TCollection, TResult>> resultSelector) where TCollection : class where TResult : class
|
||||
{
|
||||
SelectTableInfo find = null;
|
||||
if (collectionSelector.Body.NodeType == ExpressionType.Call)
|
||||
{
|
||||
var callExp = collectionSelector.Body as MethodCallExpression;
|
||||
if (callExp.Method.Name == "DefaultIfEmpty" && callExp.Object.Type.GetGenericArguments().Any())
|
||||
{
|
||||
find = _tables.Where((a, idx) => idx > 0 && a.Type == SelectTableInfoType.InnerJoin && a.Table.Type == callExp.Object.Type.GetGenericArguments()[0]).LastOrDefault();
|
||||
if (find != null)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(find.On)) find.On = Regex.Replace(find.On, $@"\b{find.Alias}\.", $"{resultSelector.Parameters[1].Name}.");
|
||||
if (!string.IsNullOrEmpty(find.NavigateCondition)) find.NavigateCondition = Regex.Replace(find.NavigateCondition, $@"\b{find.Alias}\.", $"{resultSelector.Parameters[1].Name}.");
|
||||
find.Type = SelectTableInfoType.LeftJoin;
|
||||
find.Alias = resultSelector.Parameters[1].Name;
|
||||
find.Parameter = resultSelector.Parameters[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (find == null)
|
||||
{
|
||||
var tb = _commonUtils.GetTableByEntity(typeof(TCollection));
|
||||
if (tb == null) throw new Exception($"SelectMany 错误的类型:{typeof(TCollection).FullName}");
|
||||
_tables.Add(new SelectTableInfo { Alias = resultSelector.Parameters[1].Name, AliasInit = resultSelector.Parameters[1].Name, Parameter = resultSelector.Parameters[1], Table = tb, Type = SelectTableInfoType.From });
|
||||
}
|
||||
if (typeof(TResult) == typeof(T1)) return this as ISelect<TResult>;
|
||||
_selectExpression = resultSelector.Body;
|
||||
if (_orm.CodeFirst.IsAutoSyncStructure)
|
||||
(_orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(typeof(TResult)); //._dicSyced.TryAdd(typeof(TResult), true);
|
||||
var ret = _orm.Select<TResult>() as Select1Provider<TResult>;
|
||||
Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, null);
|
||||
return ret;
|
||||
}
|
||||
public ISelect<T1> DefaultIfEmpty()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
#endregion
|
||||
|
||||
public DataTable ToDataTable<TReturn>(Expression<Func<T1, TReturn>> select)
|
||||
{
|
||||
if (select == null) return this.InternalToDataTable(select?.Body);
|
||||
@@ -1083,8 +1007,6 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_trackToList?.Invoke(list);
|
||||
}
|
||||
|
||||
public IQueryable<T1> AsQueryable() => new QueryableProvider<T1>(this);
|
||||
|
||||
#if net40
|
||||
#else
|
||||
async internal Task SetListAsync(IEnumerable<T1> list)
|
||||
|
||||
Reference in New Issue
Block a user