public LimitingDataReader(IDataReader innerReader, LimitingDataReaderMode mode) { if (innerReader == null) throw new ArgumentNullException("innerReader"); mInnerReader = innerReader; mMode = mode; }
public LimitingDataReader(IDataReader innerReader, LimitingDataReaderMode mode) { if (innerReader == null) { throw new ArgumentNullException("innerReader"); } mInnerReader = innerReader; mMode = mode; }
protected override void OnBeginVisitExpression(Expression node) { mIsInnerCall = true; mText.Length = 0; mParameters.Clear(); mIsSequence = true; mLimitingDataReaderMode = LimitingDataReaderMode.None; mElementType = null; mProperties.Clear(); }
protected override void OnBeginVisitExpression(Expression node) { mIsInnerCall = true; mText.Length = 0; mParameters.Clear(); mIsSequence = true; mLimitingDataReaderMode = LimitingDataReaderMode.None; mElementType = null; mProperties.Clear(); }
protected override Expression VisitConstant(ConstantExpression node) { if (node.IsQueryable()) { mLimitingDataReaderMode = LimitingDataReaderMode.None; mIsSequence = true; mElementType = TypeSystem.GetElementType(node.Type); var schema = @"dbo"; var table = mElementType.Name; var tableAttributes = mElementType.GetCustomAttributes(typeof(TableAttribute), true).Cast <TableAttribute>(); foreach (var tableAttribute in tableAttributes) { if (!string.IsNullOrEmpty(tableAttribute.SchemaName)) { schema = tableAttribute.SchemaName; } if (!string.IsNullOrEmpty(tableAttribute.Name)) { table = tableAttribute.Name; } } mText.Append(@"SELECT"); var separator = @" "; var properties = mElementType.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(a => a.CanRead && a.CanWrite); foreach (var property in properties) { mProperties.Add(property); var column = GetColumnName(property); mText.Append(separator); mText.Append(EncodeSqlName(column)); separator = @", "; } mText.Append(@" FROM "); mText.Append(EncodeSqlName(schema)); mText.Append(@"."); mText.Append(EncodeSqlName(table)); } else { mText.Append(node.Value.ToSqlConstant()); } return(base.VisitConstant(node)); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.Name == "Where") { mText.Append(@"SELECT * FROM ("); base.Visit(node.Arguments[0]); mText.Append(@") AS temp WHERE "); var lambda = (LambdaExpression)StripQuotes(node.Arguments[1]); base.Visit(lambda.Body); return(node); } if (node.Method.Name == "First" || node.Method.Name == "FirstOrDefault") { mText.Append(@"SELECT TOP 1 * FROM ("); var resultingNode = base.VisitMethodCall(node); mText.Append(@") AS temp"); mIsSequence = false; mLimitingDataReaderMode = node.Method.Name == "First" ? LimitingDataReaderMode.AtLeastOneRow : LimitingDataReaderMode.None; mElementType = TypeSystem.GetElementType(node.Type); return(resultingNode); } if (node.Method.Name == "Single" || node.Method.Name == "SingleOrDefault") { mText.Append(@"SELECT TOP 2 * FROM ("); var resultingNode = base.VisitMethodCall(node); mText.Append(@") AS temp"); mIsSequence = false; mLimitingDataReaderMode = (node.Method.Name == "Single" ? LimitingDataReaderMode.AtLeastOneRow : LimitingDataReaderMode.None) | LimitingDataReaderMode.AtMostOneRow; mElementType = TypeSystem.GetElementType(node.Type); return(resultingNode); } throw new InvalidOperationException(string.Format("Method [{0}] is unsupported.", node.Method.Name)); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.Name == "Where") { mText.Append(@"SELECT * FROM ("); base.Visit(node.Arguments[0]); mText.Append(@") AS temp WHERE "); var lambda = (LambdaExpression)StripQuotes(node.Arguments[1]); base.Visit(lambda.Body); return node; } if (node.Method.Name == "First" || node.Method.Name == "FirstOrDefault") { mText.Append(@"SELECT TOP 1 * FROM ("); var resultingNode = base.VisitMethodCall(node); mText.Append(@") AS temp"); mIsSequence = false; mLimitingDataReaderMode = node.Method.Name == "First" ? LimitingDataReaderMode.AtLeastOneRow : LimitingDataReaderMode.None; mElementType = TypeSystem.GetElementType(node.Type); return resultingNode; } if (node.Method.Name == "Single" || node.Method.Name == "SingleOrDefault") { mText.Append(@"SELECT TOP 2 * FROM ("); var resultingNode = base.VisitMethodCall(node); mText.Append(@") AS temp"); mIsSequence = false; mLimitingDataReaderMode = (node.Method.Name == "Single" ? LimitingDataReaderMode.AtLeastOneRow : LimitingDataReaderMode.None) | LimitingDataReaderMode.AtMostOneRow; mElementType = TypeSystem.GetElementType(node.Type); return resultingNode; } throw new InvalidOperationException(string.Format("Method [{0}] is unsupported.", node.Method.Name)); }
protected override Expression VisitConstant(ConstantExpression node) { if (node.IsQueryable()) { mLimitingDataReaderMode = LimitingDataReaderMode.None; mIsSequence = true; mElementType = TypeSystem.GetElementType(node.Type); var schema = @"dbo"; var table = mElementType.Name; var tableAttributes = mElementType.GetCustomAttributes(typeof(TableAttribute), true).Cast<TableAttribute>(); foreach (var tableAttribute in tableAttributes) { if (!string.IsNullOrEmpty(tableAttribute.SchemaName)) schema = tableAttribute.SchemaName; if (!string.IsNullOrEmpty(tableAttribute.Name)) table = tableAttribute.Name; } mText.Append(@"SELECT"); var separator = @" "; var properties = mElementType.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(a => a.CanRead && a.CanWrite); foreach (var property in properties) { mProperties.Add(property); var column = GetColumnName(property); mText.Append(separator); mText.Append(EncodeSqlName(column)); separator = @", "; } mText.Append(@" FROM "); mText.Append(EncodeSqlName(schema)); mText.Append(@"."); mText.Append(EncodeSqlName(table)); } else { mText.Append(node.Value.ToSqlConstant()); } return base.VisitConstant(node); }