如何找到任何表的最大id

本文关键字:id 任何表 何找 | 更新日期: 2023-09-27 18:29:51

我想要这样的东西:

    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 ;
     }

我知道这是错误的,但我不知道该怎么做。

如何找到任何表的最大id

您可以为此使用IEnumerable/IQueryable扩展方法DefaultIfEmpty

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

一般来说,如果你做Q.DefaultIfEmpty(D),它意味着:

如果Q不为空,请给我Q;否则,给我[ D ]

下面我围绕现有的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;
    }
}

这是我的尝试,正如蒂莫西所指出的,实际上是相当低劣的。这是因为序列将被枚举两次。调用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();
    }
}

这个实现使用了Timothy的方法。通过调用DefaultIfEmpty,我们使用了延迟执行,并且只有在调用Max时才会枚举序列。此外,我们现在使用IQueryable而不是IEnumerable,这意味着在调用此方法之前不必枚举源。正如Scott所说,如果您需要它,您也可以创建一个使用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();
    }
}

db.Tbl_Student.Aggregate(0, (maxId, s) => Math.Max(maxId, s.Id))

db.Tbl_Student.Max(s => (int?)s.Id) ?? 0