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)
鉴于您已经限制条形码,您的分组毫无意义.基本上您的查询可以简化为:
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.VersionNo是int).
这将使version一Nullable<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分析等更容易地跟踪性能方面的情况.