我想這個鏈接讀了SSDL實體框架創建自定義功能:在SSDL定義自定義功能我如何在其接受的IQueryable作爲輸入參數
https://stackoverflow.com/a/5971677
。然而,看起來,自定義函數似乎是有限的,可以接受原始類型的輸入參數。我如何將IQueryable類型作爲輸入參數傳遞?
上面的鏈接顯示Double.Parse的簡單自定義函數。但我需要更多的功能。
我想這個鏈接讀了SSDL實體框架創建自定義功能:在SSDL定義自定義功能我如何在其接受的IQueryable作爲輸入參數
https://stackoverflow.com/a/5971677
。然而,看起來,自定義函數似乎是有限的,可以接受原始類型的輸入參數。我如何將IQueryable類型作爲輸入參數傳遞?
上面的鏈接顯示Double.Parse的簡單自定義函數。但我需要更多的功能。
您可以通過LINQ表達式樹和擴展方法做到這一點:
public static IQueryable<TSource> FilterConfirmable<TSource>(this IQueryable<TSource> source, ConfirmableFilter Confirmablefilter, [Optional, DefaultParameterValue("Confirmed")] string fieldName)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (Confirmablefilter == ConfirmableFilter.All)
{
return source;
}
Type sourceType = typeof(TSource);
PropertyInfo confirmedProperty = sourceType.GetProperty(fieldName);
if (confirmedProperty == null)
{
throw new InvalidOperationException(string.Format("Can not find a boolean column named \"{0}\", Consider to add a column named \"{0}\" in your linq select expression.", fieldName));
}
ParameterExpression o = Expression.Parameter(sourceType, "o");
Expression equal = Expression.Equal(Expression.Property(o, confirmedProperty), Expression.Constant(Confirmablefilter == ConfirmableFilter.Confirmed));
MethodCallExpression whereCallExpression = Expression.Call(typeof(Queryable), "Where", new Type[] { sourceType }, new Expression[] { source.Expression, Expression.Lambda<Func<TSource, bool>>(equal, new ParameterExpression[] { o }) });
return source.Provider.CreateQuery<TSource>(whereCallExpression);
}
而且使用這樣的:
q = from i in ctx.persons select i;
q = q.FilterConfirmable(...).where(...);
什麼是ConfirmableFilter?這是你的習慣課嗎?這在子查詢中也不起作用。會嗎?看到我的問題:http://stackoverflow.com/questions/9869452/marc-gravells-dynamic-orderby-works-in-one-case-but-not-in-other – Jaggu 2012-03-26 10:12:48
@moguzalp:值得關注的是不是寫的輔助類或架構的解決方案。關心的是它是否可以實現! – Jaggu 2012-03-26 09:54:06