這不是關於'如何動態分類(基於任意用戶提供的字段)'的另一個問題?Linq To Sql - 使用衆所周知的靜態類型在運行時更改排序順序
問題是 - 當我知道潛在的種類時,如何改變排序順序? (因此避免反射/通常與真正的動態排序相關聯的自定義的表達構建。)一個大的查詢
就拿此子查詢(縮短本示例):
(from solutionIds in context.csExtendedQAIncident_Docs
where solutionIds.tiRecordStatus == 1
&& (from solutionProductAssocation in context.csProductDocs
where solutionProductAssocation.iSiteId == Settings.Current.WebUtility().Onyx.SiteId
&& (from allowedProduct in context.KB_User_Allowed_Products
where allowedProduct.UserId == userId
select allowedProduct.ModelCode
).Contains(solutionProductAssocation.chModelCd)
select solutionProductAssocation.chIdNo).Distinct().Contains(solutionIds.chIdNo)
).OrderByDescending(s => s.dtUpdateDate)
.Select(s => s.chIdNo)
.Take(count ?? Settings.Current.WCFServices().Output.HomePage.MaxRows)
的OrderByDescending部的工作原理如我會期待。
現在 - 我想這因素出類似如下:
Expression<Func<csExtendedQAIncident_Doc, IComparable>> ordering = (s) => s.dtUpdateDate;
if (viewType == HomepageViewType.MostViewed)
ordering = (s) => s.vchUserField8;
else if (viewType == HomepageViewType.MostEffective)
ordering = (s) => s.vchUserField4;
,然後使用:
OrderByDescending(ordering)
這並不編譯,但在運行時炸燬。
Unsupported overload used for query operator 'OrderByDescending'.
當然這來自深System.Data.Linq.SqlClient.QueryConverter的深處 - 尤其是VisitSequenceOperatorCall。反射該代碼表明OrderByDescending必須滿足以下條件才能正確評估。 'mc'是傳遞給方法的MethodCallExpression。
if (((mc.Arguments.Count != 2) || !this.IsLambda(mc.Arguments[1]))
|| (this.GetLambda(mc.Arguments[1]).Parameters.Count != 1))
{
break;
}
所以實質上是MethodCallExpression必須具有2個參數,其中第二個具有可與一個單一的參數(大概排序字段)一個Expressions.LambdaExpression。如果這個代碼發生了,我得到的異常被拋出。
很清楚,我沒有正確構建表達式。沒有深入挖掘,有沒有人知道如何正確構建排序表達式?
我想是這樣 OrderByDescending(Expression.Lambda>(訂貨,ordering.Parameters)) 但是,這並不完全正確要麼... –
2009-11-23 17:01:11