2012-03-26 49 views
0

我想這個鏈接讀了SSDL實體框架創建自定義功能:在SSDL定義自定義功能我如何在其接受的IQueryable作爲輸入參數

https://stackoverflow.com/a/5971677

。然而,看起來,自定義函數似乎是有限的,可以接受原始類型的輸入參數。我如何將IQueryable類型作爲輸入參數傳遞?

上面的鏈接顯示Double.Parse的簡單自定義函數。但我需要更多的功能。

+0

@moguzalp:值得關注的是不是寫的輔助類或架構的解決方案。關心的是它是否可以實現! – Jaggu 2012-03-26 09:54:06

回答

0

您可以通過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(...); 
+0

什麼是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

相關問題