2011-02-15 39 views
0

我将新元素插入到一个数据库中,其中primarry键是一个与版本号结合的条形码。如果我只是插入它们并使用假版本号,则需要9分钟的时间处理一个小文件,但是如果我使用我提供的linq语句来计算版本号,则会在干净的数据库中跳至30分钟,这会变得更糟糕如果数据库预填充。有没有更好的方法来做版本号?什么是最快的方式来分组,并在C#中获得最大的东西?

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) }; 
+0

什么是请求的基础表和SQL? – gbn 2011-02-15 10:29:55

+0

该表基本上是一个带有变种的大表,PK是条形码和版本的组合。我们正在使用SQL 2008,如果这就是你问第一个解决方案 – Andy 2011-02-15 10:48:45

回答

5

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

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 a Nullable<int>具有空值。

现在没有“其中”条款,它更有意义有分组 - 但你只需要版本的一部分,这样你就可以改变分组:

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分析等方式可以更容易地跟踪性能方面发生的变化。

相关问题