下面我已經寫了一個簡單的包裝,圍繞現有的Max
擴展方法,它允許你提供一個空的來源(你正在談論的表)。
而不是拋出一個異常,它只會返回默認值零。
原始
public static class Extensions
{
public static int MaxId<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int> selector)
{
if (source.Any())
{
return source.Max(selector);
}
return 0;
}
}
這是我的嘗試,這是由Timothy指出其實是相當低劣。這是因爲序列將被枚舉兩次。一旦調用Any
來檢查源序列是否有任何元素,並再次調用Max
時。
改進
public static class Extensions
{
public static int MaxId<TSource>(this IQueryable<TSource> source, Func<TSource, int> selector)
{
return source.Select(selector).DefaultIfEmpty(0).Max();
}
}
此實現使用提摩太的做法。通過調用DefaultIfEmpty
,我們正在使用deferred execution,並且只有在調用Max
時纔會列舉該序列。此外,我們現在使用IQueryable
而不是IEnumerable
,這意味着在調用此方法之前,我們不必枚舉源。正如斯科特所說,如果你需要它,你也可以創建一個使用IEnumerable
的過載。
爲了使用擴展方法,您只需要提供一個委託,該委託返回源類型的ID,與您對Max
的方式完全相同。
public class Program
{
YourContext context = new YourContext();
public int MaxStudentId()
{
return context.Student.MaxId(s => s.Id);
}
public static void Main(string[] args)
{
Console.WriteLine("Max student id: {0}", MaxStudentId());
}
}
public static class Extensions
{
public static int MaxId<TSource>(this IQueryable<TSource> source, Func<TSource, int> selector)
{
return source.Select(selector).DefaultIfEmpty(0).Max();
}
}
'.ToList()。COUNT()> 0',很有可能與'。任何()代替'它會提高你的表現太,因爲它不需要枚舉兩次表。 –