我有一个 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);
}
}