/// <summary> /// Adds a mapping to relate members of one spreadsheet to another by way of a selection query /// </summary> /// <typeparam name="TSheetData">Class type to return row data as</typeparam> /// <typeparam name="TSheetData2">Class of mapped type</typeparam> /// <param name="property">Lambda expression that selects the List property to set</param> /// <param name="transformation">Lambda expression that selects members from the second worksheet to relate to the first</param> /// <param name="worksheet">optional worksheet name</param> /// <example> /// AddMapping{Group,People}(g => g.GroupMembers, (g,pp) => pp.Where(p => p.GroupId == g.Id); /// </example> public void AddMapping <TSheetData, TSheetData2>( Expression <Func <TSheetData, IList <TSheetData2> > > property, Func <TSheetData, IQueryable <TSheetData2>, IQueryable <TSheetData2> > transformation, string worksheet = null) where TSheetData : class { Func <object, IQueryable, IQueryable> function = (t1, qt2) => GetFunction <TSheetData, TSheetData2>(t1, qt2, transformation); // Add the boxing operation, but get a weakly typed expression Expression converted = Expression.Convert(property.Body, typeof(object)); // Use Expression.Lambda to get back to strong typing var keyProperty = Expression.Lambda <Func <TSheetData, object> >(converted, property.Parameters); var tk = GetTransformKey(keyProperty); worksheet = worksheet ?? tk.Item2; var sheetData2Query = this.Worksheet <TSheetData2>(worksheet); _sheetDataIncludes.Add(TransformKey.Create(typeof(TSheetData2), worksheet), sheetData2Query); _foreignKeyTransformations.Add(tk, Tuple.Create(worksheet, function)); }
private TransformKey GetTransformKey <TSheetData>(Expression <Func <TSheetData, object> > property) { return(TransformKey.Create(typeof(TSheetData), GetPropertyName(property))); }