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;
}
}
これは私の試みでしたが、ティモシーが指摘したように、実際にはかなり劣っています。これは、シーケンスが 2 回列挙されるためです。Any
ソース シーケンスに要素があるかどうかを確認するために を呼び出すときに 1 回、 を呼び出すときにもう一度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();
}
}
この実装では、Timothy のアプローチを使用します。を呼び出すことで、遅延実行DefaultIfEmpty
を利用し、シーケンスは を呼び出すときにのみ列挙されます。さらに、代わりにwhich を使用しているため、このメソッドを呼び出す前にソースを列挙する必要がありません。スコットが言ったように、必要に応じて、使用するオーバーロードも作成できます。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();
}
}