/// <summary> /// 执行select操作 /// </summary> /// <typeparam name="TSource"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="source"></param> /// <param name="selector"></param> /// <returns></returns> public static LinqDLR2Sql <TResult> Select <TSource, TResult>(this LinqDLR2Sql <TSource> source, Func <TSource, TResult> selector) { var dt = DateTime.Now; var v = selector.Invoke(source.Item); var rtn = LinqDLR2Sql <TResult> .New <LinqDLR2Sql <TResult> >(v, source.Table, source.AliasName, source.LinkedDBType); rtn.DoSelect <TSource>(source); return(rtn); }
public static LinqDLR2Sql <TResult> Join <TOuter, TInner, TKey, TResult>(this LinqDLR2Sql <TOuter> outer, LinqDLR2Sql <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector) { var v1 = outerKeySelector.Invoke(outer.Item); var v2 = innerKeySelector.Invoke(inner.Item); var re = resultSelector.Invoke(outer.Item, inner.Item); var rtn = LinqDLR2Sql <TResult> .New <LinqDLR2Sql <TResult> >(re, "", "", outer.LinkedDBType); rtn.DoJoin <TOuter, TInner>(outer, inner, v1, v2); return(rtn); }
/// <summary> /// 做多重from筛选结果集 /// lamda推理逻辑: /// 1.lamda根据泛型来进行推算,因此SelectMany的算法只适用于泛型 /// 2.因为涉及到多重推算,即多个from,所以lamda会根据返回结果推算运用到参加下一次推算的TSource结构, /// 即从上自下进行from推算,第一个和第二个from根据resultSelector算出了TResult的结构,返回值必须返回一个带TResult的对象,不然后面的推算就会失败, /// 上面算出来的结果会参与到第三个的from运算,lamda根据上次返回的TResult作为这次运算中TSource的结构定义来参与本次运算。 /// 后面依次类推。 /// 所以resultSelector返回值TResult必须包含在返回值的结构定义中,不然递归推算就断裂 /// 所以selectmany只能用泛型来做定义 /// </summary> /// <typeparam name="TSource"></typeparam> /// <typeparam name="TCollector"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="source"></param> /// <param name="from"></param> /// <param name="resultSelector"></param> /// <returns></returns> public static LinqDLR2Sql <TResult> SelectMany <TSource, TCollector, TResult>(this LinqDLR2Sql <TSource> source, Func <TSource, LinqDLR2Sql <TCollector> > from, Func <TSource, TCollector, TResult> resultSelector) { //第一轮from var fromtable = from.Invoke(source.Item); var rtn = LinqDLR2Sql <TResult> .New <LinqDLR2Sql <TResult> >(resultSelector.Invoke(source.Item, fromtable.Item), "", "", fromtable.LinkedDBType); rtn.DoSelectMany <TSource>(source); rtn.DoSelectMany <TCollector>(fromtable); return(rtn); }
/// <summary> /// 执行select操作 /// </summary> /// <typeparam name="TSource"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="source"></param> /// <param name="selector"></param> /// <returns></returns> public static LinqDLR2Sql <TResult> Select <TSource, TResult>(this LinqDLR2Sql <TSource> source, Func <TSource, TResult> selector) { var dt = DateTime.Now; var v = selector.Invoke(source.Item); var rtn = LinqDLR2Sql <TResult> .New <LinqDLR2Sql <TResult> >(v, source.Table, source.AliasName, source.SQLGenerator); using (source) { rtn.SQLGenerator.DoSelect(rtn); //SQLGenerator共用一个 source.SQLGenerator = null; } return(rtn); }
public static LinqDLR2Sql <TResult> Join <TOuter, TInner, TKey, TResult>(this LinqDLR2Sql <TOuter> outer, LinqDLR2Sql <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector) { var v1 = outerKeySelector.Invoke(outer.Item); var v2 = innerKeySelector.Invoke(inner.Item); var re = resultSelector.Invoke(outer.Item, inner.Item); var rtn = LinqDLR2Sql <TResult> .New <LinqDLR2Sql <TResult> >(re, "", "", outer.SQLGenerator); using (outer) { using (inner) { rtn.SQLGenerator.DoJoin(rtn, outer, inner, v1, v2); //SQLGenerator共用一个 outer.SQLGenerator = null; } } return(rtn); }
/// <summary> /// 做多重from筛选结果集 /// lamda推理逻辑: /// 1.lamda根据泛型来进行推算,因此SelectMany的算法只适用于泛型 /// 2.因为涉及到多重推算,即多个from,所以lamda会根据返回结果推算运用到参加下一次推算的TSource结构, /// 即从上自下进行from推算,第一个和第二个from根据resultSelector算出了TResult的结构,返回值必须返回一个带TResult的对象,不然后面的推算就会失败, /// 上面算出来的结果会参与到第三个的from运算,lamda根据上次返回的TResult作为这次运算中TSource的结构定义来参与本次运算。 /// 后面依次类推。 /// 所以resultSelector返回值TResult必须包含在返回值的结构定义中,不然递归推算就断裂 /// 所以selectmany只能用泛型来做定义 /// </summary> /// <typeparam name="TSource"></typeparam> /// <typeparam name="TCollector"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="source"></param> /// <param name="from"></param> /// <param name="resultSelector"></param> /// <returns></returns> public static LinqDLR2Sql <TResult> SelectMany <TSource, TCollector, TResult>(this LinqDLR2Sql <TSource> source, Func <TSource, LinqDLR2Sql <TCollector> > from, Func <TSource, TCollector, TResult> resultSelector) { //第一轮from var fromtable = from.Invoke(source.Item); var rtn = LinqDLR2Sql <TResult> .New <LinqDLR2Sql <TResult> >(resultSelector.Invoke(source.Item, fromtable.Item), "", "", source.SQLGenerator); using (source) { rtn.SQLGenerator.DoSelectMany(rtn, source); //source的SQLGenerator被rtn共用 source.SQLGenerator = null; } using (fromtable) { rtn.SQLGenerator.DoSelectMany(rtn, fromtable); } return(rtn); }
/// <summary> /// 执行GroupBy操作,join表操作 /// </summary> /// <typeparam name="TSource"></typeparam> /// <typeparam name="TKey"></typeparam> /// <typeparam name="TElement"></typeparam> /// <param name="source"></param> /// <param name="keySelector"></param> /// <param name="elementSelector"></param> /// <returns></returns> public static LinqDLR2Sql <TElement> GroupBy <TSource, TKey, TElement>(this LinqDLR2Sql <TSource> source, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector) { /*对应的group by语句为 * group <TElement> by <TKey> into g * 其中linq会根据return类型来推断g的结构 */ var tmp = keySelector(source.Item); //element var tmp2 = elementSelector(source.Item); using (source) { var rtn = LinqDLR2Sql <TElement> .New <LinqDLR2Sql <TElement> >(tmp2, source.Table, source.AliasName, source.SQLGenerator); rtn.SQLGenerator.DoGroupBy(rtn, source, tmp); //与source共用一个SQLGenerator source.SQLGenerator = null; return(rtn); } }