public class FlightQuery : IQueryable<Flight> {
FlightQueryProvider provider;
Expression expression;

public FlightQuery(FlightQueryProvider provider) {
if (provider == null) {
	throw new ArgumentNullException("provider");
}
this.provider = provider;
this.expression = Expression.Constant(this);
}

public FlightQuery(FlightQueryProvider provider, Expression expression) {
if (provider == null) {
	throw new ArgumentNullException("provider");
}
if (expression == null) {
	throw new ArgumentNullException("expression");
}
if (!typeof(IQueryable<Flight>).IsAssignableFrom(expression.Type)) {
	throw new ArgumentOutOfRangeException("expression");
}
this.provider = provider;
this.expression = expression;
}

#region IQueryable implementation
Expression IQueryable.Expression { get { return this.expression; } }
Type IQueryable.ElementType { get { return typeof(Flight); } }
IQueryProvider IQueryable.Provider { get { return this.provider; } }
#endregion IQueryable implementation

#region IEnumerable<T> implementation
public IEnumerator<Flight> GetEnumerator() {
return ((IEnumerable<Flight>)
	this.provider.Execute(this.expression)).GetEnumerator();
}
#endregion IEnumerable<T> implementation

#region IEnumerable implementation
IEnumerator IEnumerable.GetEnumerator() {
return ((IEnumerable)
	this.provider.Execute(this.expression)).GetEnumerator();
}
#endregion IEnumerable implementation

public override string ToString() {
	return this.provider.GetQueryText(this.expression);
}
}
