如何找到任何表的最大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 ;
}
我知道这是错误的,但我不知道该怎么做。
您可以为此使用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