1
我有一個LINQ表達式被用作LINQ to SQL語句where子句中的文件管理器。我的問題是,LINQ to SQL表達式變得笨拙,而且它所包含的邏輯已經在多個位置結束了,違反了DRY(這是我第三次處理QA引起的不同步問題)。鞏固或重用LINQ表達式
有沒有什麼辦法可以重用像下面那樣的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);
}
}
可以'開關(串)' – abatishchev 2010-10-29 12:44:56
我不認爲L2S可以轉換一個'之開關到SQL。 – 2012-02-29 03:53:38