I recovered some spaghetti code and I have to refactor it. I do not want a method with over 200 lines, for me it is not object oriented programming. I am trying to ponder on the question and would like to have your suggestions.
private static IQueryable<Trade> BuildTradeQuery(IRepositoryFactory repository, SearchCriteria SearchCriteria)
{
var query = GetTrades(repository);
var dteToday = DateTime.Today;
if (SearchCriteria.RemitterId != null)
{
query = query.Where(x => x.RemitterId == (Remitter) SearchCriteria.RemitterId);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.TradeReference))
{
query = query.Search(x => x.TradeReference, SearchCriteria.TradeReference);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.Sicovam))
{
query = query.Search(x => x.Sicovam, SearchCriteria.Sicovam);
}
if (SearchCriteria.AssetClassId != null)
{
query = query.Where(x => x.AssetClassId == (AssetClass) SearchCriteria.AssetClassId);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.Desk))
{
query = query.Where(x => x.Desk == SearchCriteria.Desk);
}
if (SearchCriteria.SubGroupUpiId != null)
{
query = query.Where(x => x.SubGroupUpiId == (SubGroupUpi) SearchCriteria.SubGroupUpiId);
}
if (SearchCriteria.IsBuy != null)
{
query = query.Where(x => x.IsBuy == SearchCriteria.IsBuy);
}
if (SearchCriteria.FromTradeDate != null)
{
query = query.Where(x => x.TradeDate >= SearchCriteria.FromTradeDate);
}
if (SearchCriteria.ToTradeDate != null)
{
query = query.Where(x => x.TradeDate <= SearchCriteria.ToTradeDate);
}
if (SearchCriteria.FromStartDate != null)
{
query = query.Where(x => x.StartDate >= SearchCriteria.FromStartDate);
}
if (SearchCriteria.ToStartDate != null)
{
query = query.Where(x => x.StartDate <= SearchCriteria.ToStartDate);
}
if (SearchCriteria.FromEndDate != null)
{
query = query.Where(x => x.EndDate >= SearchCriteria.FromEndDate);
}
if (SearchCriteria.ToEndDate != null)
{
query = query.Where(x => x.EndDate <= SearchCriteria.ToEndDate);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.UtiPrefix))
{
query = query.Where(x => x.UtiPrefix == SearchCriteria.UtiPrefix);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.UtiValue))
{
query = query.Where(x => x.UtiValue == SearchCriteria.UtiValue);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.UsiPrefix))
{
query = query.Where(x => x.UsiPrefix == SearchCriteria.UsiPrefix);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.UsiValue))
{
query = query.Where(x => x.UsiValue == SearchCriteria.UsiValue);
}
if (SearchCriteria.ReasonCodeId != null)
{
query = query.Where(x => x.ReasonCodeId == (ReasonCode) SearchCriteria.ReasonCodeId);
}
if (SearchCriteria.PutCallId != null)
{
query = query.Where(x => x.PutCallId == (PutCall) SearchCriteria.PutCallId);
}
if (SearchCriteria.FromNotional != null)
{
query = query.Where(x => x.Notional1 >= SearchCriteria.FromNotional);
}
if (SearchCriteria.ToNotional != null)
{
query = query.Where(x => x.Notional1 <= SearchCriteria.ToNotional);
}
if (SearchCriteria.CurrencyId != null)
{
query = query.Where(x => x.FirstCurrencyId == (Currency) SearchCriteria.CurrencyId);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.CounterpartMnemo))
{
query = query.Search(x => x.Counterpart.Mnemo, SearchCriteria.CounterpartMnemo);
}
if (!string.IsNullOrWhiteSpace(SearchCriteria.CounterpartLegalName))
{
query = query.Search(x => x.Counterpart.LegalName, SearchCriteria.CounterpartLegalName);
}
if (SearchCriteria.CounterpartClassificationId != null)
{
query =
query.Where(
x =>
x.Counterpart.CounterpartClassificationId ==
(CounterpartClassification) SearchCriteria.CounterpartClassificationId);
}
if (SearchCriteria.IsEarlyMatured == false)
{
query = query.Where(x => x.IsEarlyMatured != true);
}
if (SearchCriteria.IsMatured == false)
{
query = query.Where(x => x.EndDate > dteToday);
}
if (SearchCriteria.IsNonMatured == false)
{
query = query.Where(x => x.EndDate <= dteToday);
}
if (SearchCriteria.PendingTrade == false)
{
query = query.Where(x => x.TradeStatusId != TradeStatus.Pending);
}
if (SearchCriteria.VerifiedTrade == false)
{
query = query.Where(x => x.TradeStatusId != TradeStatus.Verified);
}
if (SearchCriteria.CanceledTrade == false)
{
query = query.Where(x => x.TradeStatusId != TradeStatus.Canceled);
}
if (SearchCriteria.EventReference != null)
{
var refExpression = QueryableExtension.BuildSearchExpression<Event>(x => x.EventReference,
SearchCriteria.EventReference);
query =
query.Where(
trade =>
trade.Event.AsQueryable().Any(refExpression));
}
if (SearchCriteria.PendingEvent == false)
{
query = query.Where(trade => trade.Event.All(evt => evt.EventStatusId != EventStatus.Pending));
}
if (SearchCriteria.VerifiedEvent == false)
{
query = query.Where(trade => trade.Event.All(evt => evt.EventStatusId != EventStatus.Verified));
}
if (SearchCriteria.CanceledEvent == false)
{
query = query.Where(trade => trade.Event.All(evt => evt.EventStatusId != EventStatus.Canceled));
}
if (SearchCriteria.EventReasonCodeId != null)
{
query =
query.Where(trade => trade.Event.Any(evt => evt.ReasonCodeId == SearchCriteria.EventReasonCodeId));
}
var documentStatus = new List<DocumentStatus?>(Enum.GetValues(typeof(DocumentStatus)).OfType<DocumentStatus?>()) {null};
documentStatus.Remove(DocumentStatus.Declined);
var noFilterCount = documentStatus.Count;
if (SearchCriteria.DocumentNoStatus == false)
{
documentStatus.Remove(null);
}
if (SearchCriteria.DocumentPending == false)
{
documentStatus.Remove(DocumentStatus.Pending);
}
if (SearchCriteria.DocumentPendingApproval == false)
{
documentStatus.Remove(DocumentStatus.PendingValidation);
}
if (SearchCriteria.DocumentApproved == false)
{
documentStatus.Remove(DocumentStatus.Approved);
}
if (documentStatus.Count != noFilterCount)
{
if (documentStatus.Contains(null))
{
query =
query.Where(
trade =>
!trade.Indexation.Any() ||
trade.Indexation.Any(indexation => !indexation.Document.Any()) ||
trade.Indexation.Any(
indexation =>
indexation.Document.Any(
document => documentStatus.Contains(document.DocumentStatusId))));
}
else
{
query =
query.Where(
trade => trade.Indexation.Any(
indexation =>
indexation.Document.Any(
document => documentStatus.Contains(document.DocumentStatusId))));
}
}
return query;
}