/// <summary>
/// Standardn situace podporuje srovnvn na rovnost u etzc a 
/// dal porovnvn pro celoseln hodnoty GroundSpeed a Altitude 
/// </summary>
private void TranslateStandardComparisons(
ExpressionType nodeType,
ConstantExpression constant,
MemberExpression memberAccess) {

string stringFieldName =
(from field in typeof(Flight).GetProperties()
where Type.GetTypeCode(field.PropertyType) == TypeCode.String
	&& field.Name == memberAccess.Member.Name
select field.Name).FirstOrDefault();

// Smyka pro vechny etzce (Airline, FlightNumber a Aircraft)
if (stringFieldName != null) {
if (nodeType != ExpressionType.Equal) {
throw new NotSupportedException(
string.Format(
"Binrni opertor '{0}' nen pro len {1} podporovn.",
nodeType,
memberAccess.Member.Name));
}
queryParameters.Filter.GetType()
.GetField(stringFieldName)
.SetValue(queryParameters.Filter, constant.Value);
}
else {
// etzec nenalezen
switch (memberAccess.Member.Name) {
case "GroundSpeed":
SetIntParameter(
GetIntConstant(constant),
ref queryParameters.Filter.MinGroundSpeed,
ref queryParameters.Filter.MaxGroundSpeed,
nodeType);
break;
case "Altitude":
SetIntParameter(
GetIntConstant(constant),
ref queryParameters.Filter.MinAltitude,
ref queryParameters.Filter.MaxAltitude,
nodeType);
break;
default:
throw new NotSupportedException(
string.Format("Podmnka pro len {0} nen podporovna.",
memberAccess.ToString()));
}
}
}

internal static void SetIntParameter(
int limit,
ref int minValue,
ref int maxValue,
ExpressionType comparison) {
switch (comparison) {
case ExpressionType.Equal:
MinValue = limit;
MaxValue = limit;
break;
case ExpressionType.LessThan:
MaxValue = limit - 1;
break;
case ExpressionType.LessThanOrEqual:
MaxValue = limit;
break;
case ExpressionType.GreaterThan:
MinValue = limit + 1;
break;
case ExpressionType.GreaterThanOrEqual:
MinValue = limit;
break;
default:
throw new NotSupportedException(
string.Format(
"Binrn opertor '{0}' nen podporovn.",
comparison));
}
}
