У меня есть выражение LINQ, которое используется в качестве файла в выражении LINQ to SQL where.Моя проблема в том, что выражение LINQ to SQL стало громоздким, а также содержащаяся в нем логика оказалась в нескольких местах, нарушая DRY (это третий раз, когда я работаю над ошибкой, поднятой QA из-за его несинхронизации).
Можно ли как-нибудь использовать выражение LINQ, подобное приведенному ниже, или разложить его на более мелкие подвыражения?Моя самая большая проблема заключается в том, что поскольку выражение используется в вызове LINQ to SQL, оно не может использовать никакие другие классы или методы, поскольку библиотека LINQ to SQL не знает, как выразить их как SQL.
public static Expression<Func<MyClass, bool>> MyClassFilterExpression
{
get
{
return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 5)) ? "Refused" :
(x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 6)) ? "Cancelled" :
(x.DateTimeExpired.HasValue && DateTime.Today > x.DateTimeExpired.Value) ? "Expired" :
(x.Duration.HasValue && x.DurationTypeID.HasValue && x.DateTimeApproved.HasValue) ?
(x.DurationTypeID == (int)DurationTypes.Day && DateTime.Today > x.DateTimeApproved.Value.AddDays(x.Duration.Value)) ? "Expired" :
(x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 4 || y.StatusID == 10)) ? "Approved" : "Pending").Contains(filterValue);
}
}
В идеале, я бы хотел иметь что-то вроде ниже.Это не работает, потому что LINQ to SQL не может выразить метод GetStatus ().Надеюсь, есть какой-нибудь другой умный способ сделать это?
public ReviewStatuses GetStatus(DateTime? dateTimeExpired, int? reviewStatusID)
{
var isExpired = (dateTimeExpired.HasValue && DateTime.Today >= dateTimeExpired.Value.Date);
if (reviewStatusID == ReviewStatuses.Cancelled.GetHashCode())
{
return ReviewStatuses.Cancelled;
}
else if (reviewStatusID == ReviewStatuses.Refused.GetHashCode())
{
return ReviewStatuses.Refused;
}
return ReviewStatuses.Pending;
}
public static Expression<Func<MyClass, bool>> MyClassFilterExpression
{
get
{
return x => x.Status.Count > 0 && x.Status.Any(y => GetStatus(y.DateTimeExpired, y.StatusID)).Contains(filterValue);
}
}