在c#中分组并获取MAX的最快方法是什么?

And*_*ndy 0 c# sql linq c#-4.0

我将新元素插入到数据库中,其中主要键是条形码与版本号组合.如果我只是插入它们并使用假的版本号,这需要我9分钟的小文件,但是,如果我使用我提供的linq语句来计算版本号,这在一个干净的数据库中跳跃了30分钟,这会稍微恶化如果数据库已预先填充.有没有更好的方法来做版本号?

var results = from p in dataContext.GetTable<mailsortEntity>()
                              where p.Barcode == barcode
                              group p by p.Barcode into g
                              select new { currentVersionNo = g.Max(p => p.VersionNo) };
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

鉴于您已经限制条形码,您的分组毫无意义.基本上您的查询可以简化为:

var version = dataContext.GetTable<mailSortEntity>()
                         .Where(p => p.Barcode == barcode)
                         .Max(p => p.VersionNo);
Run Code Online (Sandbox Code Playgroud)

编辑:如果您需要允许条形码根本不在数据库中的情况,您可以使用可以为空的形式:

var version = dataContext.GetTable<mailSortEntity>()
                         .Where(p => p.Barcode == barcode)
                         .Max(p => (int?) p.VersionNo);
Run Code Online (Sandbox Code Playgroud)

(假设p.VersionNoint).

这将使versionNullable<int>,如果条形码不在数据库中一个空值.

现在没有"where"子句,进行分组更有意义 - 但是您只需要版本部分,因此您可以更改分组:

var results = from p in dataContext.GetTable<mailsortEntity>()
              group p.VersionNo by p.Barcode into g
              select g.Max();
Run Code Online (Sandbox Code Playgroud)

另一方面,它不会告诉您哪个版本号是条形码的最大值,因此您可能需要:

var results = from p in dataContext.GetTable<mailsortEntity>()
              group p.VersionNo by p.Barcode into g
              select new { Barcode = g.Key, CurrentVersion = g.Max() };
Run Code Online (Sandbox Code Playgroud)

我不知道这些是否会提高您的查询性能,但它们是您查询的更合理的表示形式,这可以使用SQL分析等更容易地跟踪性能方面的情况.