0

私はこのようなものが欲しいです:

    public int NumberStudent()
    {
        int i = 0;
        if (db.Tbl_Student.ToList().Count() > 0)
            i = db. Tbl_Student.Max(d => d.id);
        return i;
     }

ただし、任意のテーブルで使用したいと思います。

   public int FindMaxId(string TableName)
     {
       int i =0;
        if ('db.'+TableName+'.ToList().Count() > 0' )
           i = db. TableName.Max(d => d.id);
        return i ;
     }

私はそれが間違っていることを知っていますが、それを行う方法がわかりません。

4

3 に答える 3

9

IEnumerableこれには/IQueryable拡張メソッドを使用できますDefaultIfEmpty

var maxId = db.Tbl_Student.Select(x => x.Id).DefaultIfEmpty(0).Max();

一般的にはQ.DefaultIfEmpty(D)、次のことを意味します。

空でない場合Qは、私にくださいQ; そうでなければ、私にください[ D ]

于 2013-08-30T19:43:09.740 に答える
4

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 を使用しているため、このメソッドを呼び出す前にソースを列挙する必要がありません。スコットが言ったように、必要に応じて、使用するオーバーロードも作成できます。MaxIQueryableIEnumerableIEnumerable

拡張メソッドを使用するには、ソース タイプの 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();
    }
}
于 2013-08-30T19:40:20.910 に答える