Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何查找任何表的最大id。_C#_Linq - Fatal编程技术网

C# 如何查找任何表的最大id。

C# 如何查找任何表的最大id。,c#,linq,C#,Linq,我想要这样的东西: 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 TableNam

我想要这样的东西:

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

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

下面我围绕现有的Max-extension方法编写了一个简单的包装器,它允许您提供一个空的源代码,即您所说的表

它不会抛出异常,只会返回默认值零

原创的

此实现使用Timothy的方法。通过调用DefaultIfEmpty,我们将使用,并且序列将仅在调用Max时枚举。此外,我们现在使用IQueryable而不是IEnumerable,这意味着在调用此方法之前不必枚举源。正如Scott所说,如果您需要它,您也可以创建一个使用IEnumerable的重载

为了使用扩展方法,您只需要提供一个委托,该委托返回源类型的id,与Max完全相同

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

var maxId = db.Tbl_Student.Select(x => x.Id).DefaultIfEmpty(0).Max();
通常,如果您执行Q.DefaultIFEmptyDd,则表示:

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

db.Tbl_Student.Aggregate0,maxId,s=>Math.MaxmaxId,s.Id 或
db.Tbl_Student.Maxs=>int?s.Id??看看我的答案。有一种不太为人所知的LINQ方法已经存在了。另一种很好的方法,当然。这只猫可以用很多方法剥皮!向上投票:关键是MaxId helper方法的主体可以简单地替换为返回源代码.Selectselector.DefaultIfEmpty0.Max;。支持组合现有操作,而不是从头开始创建新操作。您的MaxId方法实际上会枚举源代码两次。这是非常正确的,谢谢您的提示。如果可以的话,我会用你的方法更新代码片段,我完全同意。甚至可以记下您的第一个实现,以及为什么最好只切换一次枚举源代码,而不是两次。另外,您可以将其改为IQueryable扩展方法,这样就可以在数据库端而不是客户端完成。ToList.Count>0很可能被替换为。它也会提高性能,因为它不需要枚举表两次。啊,我的错。。我现在明白了,这实际上适用于任何表,我的坏+1var maxId=db.Tbl_Student.Maxs=>int?s.Id??谢谢。但我想用这个做任何桌子。我想传递表的名称,它返回maxid。
public static class Extensions
{
    public static int MaxId<TSource>(this IQueryable<TSource> source, Func<TSource, int> selector)
    {
        return source.Select(selector).DefaultIfEmpty(0).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();
    }
}
var maxId = db.Tbl_Student.Select(x => x.Id).DefaultIfEmpty(0).Max();