【问题标题】:What is the quickest way to group by and get the MAX of something in c#?在 c# 中分组并获得 MAX 的最快方法是什么?
【发布时间】:2011-02-15 10:28:19
【问题描述】:

我正在将新元素插入数据库,其中主键是条形码和版本号。如果我只是插入它们并使用假的版本号,这需要我 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) };

【问题讨论】:

  • 请问下的底层表和SQL是什么?
  • 表基本就是一个带varchars的大表,PK是Barcode和version的组合。如果这就是您的要求,我们正在使用 SQL 2008

标签: c# sql linq c#-4.0


【解决方案1】:

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

var version = dataContext.GetTable<mailSortEntity>()
                         .Where(p => p.Barcode == barcode)
                         .Max(p => p.VersionNo);

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

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

(假设p.VersionNoint)。

如果条形码不在数据库中,这将使version 成为具有空值的Nullable&lt;int&gt;

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

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

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

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

我不知道这些是否会改善您的查询性能,但它们是您查询的更合乎逻辑的表示,这可能更容易使用 SQL 跟踪性能方面的情况分析等。

【讨论】:

  • 如果条形码尚未在数据库中,您的第一个解决方案似乎有问题,有没有办法在不更改实体的情况下绕过它?
猜你喜欢
  • 2022-01-20
  • 2022-12-24
  • 2016-02-12
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2019-10-11
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多