I have seen code written which contains ternary operators nested more than 7 levels deep. I find it very difficult to read the code. Is it a good practice to have nested ternary operators? What do you suggest to replace these nested ternary operators with?
This is some code I came across.
var qry = from row in tflResults.AsEnumerable()
let _date = row.Field<DateTime>("RestoreDate")
let fDeadline = row.IsNull("RestorefDeadline") ? null : row.Field<DateTime?>("RestorefDeadline")
where checkSecResp(noResp, SecResp, row) && checkDept(noDept, Depts, row) && checkSpace(selectedWebs, row)
&& _date >= startDate && _date <= endDate
group row by
new
{
RestoreNumber = row.Field<string>("RestoreNumber") ? row.Field<string>("RestoreNumber") : row.Field<string>("RestoreNetNumber"),
EDate = _date,
}
into g
let r = g.FirstOrDefault()
let RestoreNumber = r.Field<string>("RestoreNumber") ?? r.Field<string>("RestoreNetNumber")
let requests = from req in queryRequest
where req.RestoreIntelNumber.StartsWith(RestoreNumber + ".")
where req.Status != "Deleted" && req.Status != "Cancelled"
select req
select new
{
RestoreDate = g.Key.EDate,
RestoreRequestDate = r.IsNull("RestoreRequestDate") ? "" : r.Field<DateTime>("RestoreRequestDate").ToLocalTime().Date,
RestoreNumber = RestoreNumber,
RestoreDraftDeadline = r.IsNull("RestoreOffDeadline") ? "" : r.Field<DateTime>("RestoreOffDeadline").ToLocalTime(),
RestoreSecResp = r["RestoreSecResp"],
RestoreOffMemberResp = r["RestoreOffMemberResp"],
RequestSent = requests.Count() > 0 && requests.All(req => req.Status == "Versont" || req.Status == "Ontvogen")
? "Ja"
: requests.Any(req => req.Status == "Versont" || req.Status == "Ontvongen") ? "Wat" : "",
RestoreIsfized = r.IsNull("RestoreIsfized") ? false : r.Field<bool>("RestoreIsfized"),
IsUrgent = r.IsNull("RestoreIsUrgent") ? "" : r.Field<bool>("RestoreIsUrgent") ? "Ja" : "",
WorkingDaysToPrep = r["RestoreUrgency"],
fDeadlineForSort = r.IsNull("RestorefDeadline") ? null : r.Field<DateTime>("RestorefDeadline").ToLocalTime()
};
qry = sortedField == "fDeadline"
? qry.Where(b => b.fDeadlineForSort == null || startfDeadline == null || endfDeadline == null || (b.fDeadlineForSort >= startfDeadline && b.fDeadlineForSort <= endfDeadline))
: qry.Where(b => b.RestoreDate >= startDate && b.RestoreDate <= endDate);
qry = sortedDescending
? qry.OrderByDescending(b => sortedField == "fDeadline" ? b.fDeadlineForSort : b.RestoreDate)
: qry.OrderBy(b => sortedField == "fDeadline" ? b.fDeadlineForSort : b.RestoreDate);