/// <summary> /// Creates or gets a DELETE query /// </summary> /// <param name="objectToDelete"></param> /// <param name="queryContext"></param> /// <returns></returns> public BulkQuery GetDeleteQuery <T>(DataContext dataContext) { var sqlProvider = dataContext.Vendor.SqlProvider; var rowType = typeof(T); var table = dataContext.Mapping.GetTable(rowType); var deleteParameters = new List <ObjectInputParameterExpression>(); var pkColumns = new List <SqlStatement>(); var pkValues = new List <SqlStatement>(); foreach (var pkMember in table.RowType.IdentityMembers) { var memberInfo = pkMember.Member; var getter = (Expression <Func <object, object> >)(o => memberInfo.GetMemberValue(o)); var inputParameter = new ObjectInputParameterExpression( getter, memberInfo.GetMemberType(), pkMember); var column = sqlProvider.GetColumn(pkMember.MappedName); pkColumns.Add(column); pkValues.Add(sqlProvider.GetParameterName(inputParameter.Alias)); deleteParameters.Add(inputParameter); } var deleteSql = sqlProvider.GetDelete(sqlProvider.GetTable(table.TableName), pkColumns, pkValues); return(new BulkQuery { DataContext = dataContext, Sql = deleteSql, InputParameters = deleteParameters }); }
protected virtual UpsertParameters GetUpsertParameters <T>(bool update, ICollection <MemberInfo> modifiedMembers, DataContext dataContext) { var rowType = typeof(T); var sqlProvider = dataContext.Vendor.SqlProvider; var upsertParameters = new UpsertParameters { Table = dataContext.Mapping.GetTable(rowType) }; foreach (var dataMember in upsertParameters.Table.RowType.PersistentDataMembers) { var column = sqlProvider.GetColumn(dataMember.MappedName); ParameterType type = GetParameterType(dataMember, update, update ? AutoSync.OnUpdate : AutoSync.OnInsert); var memberInfo = dataMember.Member; // if the column is generated AND not specified, we may have: // - an explicit generation (Expression property is not null, so we add the column) // - an implicit generation (Expression property is null // in all cases, we want to get the value back var getter = (Expression <Func <object, object> >)(o => memberInfo.GetMemberValue(o)); var inputParameter = new ObjectInputParameterExpression( getter, memberInfo.GetMemberType(), dataMember); if (dataMember.IsPrimaryKey && (!dataMember.IsDbGenerated)) { upsertParameters.PKColumns.Add(column); upsertParameters.PKParameters.Add(inputParameter); upsertParameters.PKValues.Add(sqlProvider.GetParameterName(inputParameter.Alias)); } if (type == ParameterType.Output) { if (dataMember.Expression != null) { upsertParameters.InputColumns.Add(column); upsertParameters.InputValues.Add(dataMember.Expression); } var setter = (Expression <Action <object, object> >)((o, v) => memberInfo.SetMemberValue(o, v)); var outputParameter = new ObjectOutputParameterExpression(setter, memberInfo.GetMemberType(), dataMember.Name); if ((dataMember.IsPrimaryKey) && (dataMember.IsDbGenerated)) { upsertParameters.AutoPKColumns.Add(column); } upsertParameters.OutputColumns.Add(column); upsertParameters.OutputParameters.Add(outputParameter); upsertParameters.OutputValues.Add(sqlProvider.GetParameterName(outputParameter.Alias)); upsertParameters.OutputExpressions.Add(dataMember.Expression); } else // standard column { var isModified = modifiedMembers != null && modifiedMembers.Contains(memberInfo); if (type == ParameterType.InputPK) { upsertParameters.InputPKColumns.Add(column); upsertParameters.InputPKValues.Add(sqlProvider.GetParameterName(inputParameter.Alias)); if (isModified) { // stupid! PK is modified, so we will never find the column //upsertParameters.InputColumns.Add(column); //upsertParameters.InputValues.Add(sqlProvider.GetParameterName(inputParameter.Alias+"Old")); upsertParameters.InputParameters.Add(inputParameter); } else { upsertParameters.InputParameters.Add(inputParameter); } } // for a standard column, we keep it only if modifiedMembers contains the specified memberInfo // caution: this makes the cache harder to maintain else if (modifiedMembers == null || isModified) { upsertParameters.InputColumns.Add(column); upsertParameters.InputValues.Add(sqlProvider.GetParameterName(inputParameter.Alias)); upsertParameters.InputParameters.Add(inputParameter); } if (type == ParameterType.AutoSync) { var setter = (Expression <Action <object, object> >)((o, v) => memberInfo.SetMemberValue(o, v)); var outputParameter = new ObjectOutputParameterExpression(setter, memberInfo.GetMemberType(), dataMember.Name); upsertParameters.OutputColumns.Add(column); upsertParameters.OutputParameters.Add(outputParameter); upsertParameters.OutputValues.Add(sqlProvider.GetParameterName(outputParameter.Alias)); upsertParameters.OutputExpressions.Add(dataMember.Expression); } } } return(upsertParameters); }