我在寫一個LINQ 2 SQL擴展方法的集合。現在,我有一堆重複的方法,一個在IEnumerable集合上工作,另一個在IQueryable集合上工作。例如C#:使用不同的類型參數重載LINQ泛型方法
public static IQueryable<X> LimitVisible(this IQueryable<X> items) {
return items.Where(x => !x.Hidden && !x.Parent.Hidden);
}
public static IEnumerable<X> LimitVisible(this IEnumerable<X> items) {
return items.Where(x => !x.Hidden && !x.Parent.Hidden);
}
我想我需要這樣的重複,因爲我希望能夠保留在某些情況下IQueryable的行爲,讓執行被推遲到數據庫中。 這是一個正確的假設,還是單個IEnumerable方法(加上將輸出轉換爲IQueryable)的工作?如果我需要兩個,我不喜歡重複,所以我想用一般的方法
public static T LimitVisible<T>(this T items) where T : IEnumerable<X> {
return (T)items.Where(x => !x.Hidden && !x.Parent.Hidden);
}
這工作,除了我還有其他類型的比X將兩者結合起來(說Y和Z),其我也想寫爲LimitVisible函數。但我不能寫
public static T LimitVisible<T>(this T items) where T : IEnumerable<Y> {
return (T)items.Where(y => !y.Hidden && !y.Parent.Hidden);
}
因爲您可以基於泛型進行重載。我可以將這些方法放在不同的類中,但這似乎不是正確的解決方案。
有什麼建議嗎?也許我做了不正確的假設,並且首先不需要特定的IQueryable版本。
編輯:另一種選擇
下面是我在過去使用的另一種模式,以避免重複
private static readonly Expression<Func<X, bool>> F = x => !x.Hidden && !x.Parent.Hidden;
public static IEnumerable<X> LimitVisible(this IEnumerable<X> e) {
return e.Select(W.Compile());
}
public static IQueryable<X> LimitVisible(this IQueryable<X> q) {
return q.Select(W);
}
是否有任何與此危險?
不X,Y,Z有一個共同的接口或基類的'Hidden'和'父'屬性? – Magnus
不,它們是數據庫中不同的表格,它們都碰巧具有隱藏字段。 –