繁体   English   中英

如何使用linq从表中获取最大ID

[英]how to get max id from a table using linq

我有一个表Estimation,其中有一个列EstimationNo,我试图像这样获得最大EstimationNo-

var result = cont.SalesEstimateCont.Where(x => x.Org_ID == CurrentOrgId);
var estimationMaxNo = result.Any() ? result.Max(x => x.EstimateNo) + 1 : 1;

  var DigitalEstimate = new SalesEstimate()
        {
            EstimateNo=estimationMaxNo;
        };
    cont.Estimate.Add(DigitalEstimate );
    cont.Savechanges();

但是问题是,如果同一张表由不同的用户同时保存,则为两个用户保存相同的EstimationNo。 喜欢-10,10

现在,如何处理此问题。请提供一些解决方案。

最好的策略是让数据库引擎(我假设它是SQL Server)来处理EstimateNo字段的递增。 这可以通过标识规范来完成,该标识规范也可以添加到普通的非主键字段中。

ALTER TABLE SalesEstimateCont drop column EstimateNo 
go
ALTER TABLE SalesEstimateContadd Add EstimateNo int NOT NULL IDENTITY (1,1) 

请注意:如果您有现有数据或应修改某些数据,则可能需要付出额外的努力才能实现此目的(即使用临时表并通过将IDENTITY INSERT ON设置为)

我得到一个简单的答案,我只需要使用transacationScope类。 并锁定资源表。 像这样-

 using (TransactionScope scope = new TransactionScope())
      {
cont.Database.ExecuteSqlCommand("SELECT TOP 1 * FROM Sales__Estimate WITH (TABLOCKX, HOLDLOCK)");
var result = cont.SalesEstimateCont.Where(x => x.Org_ID == CurrentOrgId);
var estimationMaxNo = result.Any() ? result.Max(x => x.EstimateNo) + 1 : 1;

  var DigitalEstimate = new SalesEstimate()
        {
            EstimateNo=estimationMaxNo;
        };
    cont.Estimate.Add(DigitalEstimate );
    cont.Savechanges();
}

如果您可以使EstimateNo为“身份”列,则这是解决此问题的最简单/最佳方法。 如果您可以将其更改为Guid,那将是解决此问题的另一种简便方法,因为无论用户如何,PK都是唯一的。

如果您不能执行任何一项操作,而必须手动使用Max(),则可能要考虑创建另一个表,该表中存储有下一个可用数字。 然后,您可以创建一个带有Seri​​alizable事务的新SqlCommnand来锁定表,将#更新1,然后将其重新选择。 如果同时命中两个更新命令,则只有一个更新将运行,并且在与Serializable事务的连接关闭之前不会放手。 这样,您就可以在其他更新运行之前选择新近更新的号码,并获得现在“唯一”的下一个号码。

您可以OrderByDescending ,然后Take第一个记录

var estimationMaxNo = result.OrderByDescending(x => x.EstimateNo).Take(1);

可以在单个命令中完成。 您需要为主要ID设置IDENTITY属性

ALTER TABLE SalesEstimateCont ADD Org_ID int NOT NULL IDENTITY (1,1) PRIMARY KEY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM