linq 插入表中max(id)+1行

mnemlml8  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(139)

我有一个没有主键的events表,但是id列是唯一的(我不能改变表结构)。

id|name
_______
1 | a
2 | b
3 | c

我想运行此查询以插入新行

insert into event (id, name) values ((select max(id) + 1 from event), 'd')

我写了这段代码

var evn_event= _unitOfWork.EventRepository.GetQueryableAsync();
long EVENT_CNT = evn_event.Max(x => x.EVENT_CNT)+1;

var entity = new EVENT
{
    id = EVENT_CNT,
    name = 'd',            
};
var result =  _unitOfWork.EventRepository.InsertAsync(entity, autoSave: true);

使用此代码,有时我会因为输入的id值不唯一而出现异常(因为在select max id和insert之间的间隔中插入了一条记录)。

问题:如何编写此查询的相等代码

insert into event (id, name) values ((select max(id) + 1 from event), 'd')

select max(id)+1运行同步插入语句?

c7rzv4ha

c7rzv4ha1#

有一个更好的选择来删除上述过程,你必须改变表结构,这样你就不必手动填充ID.执行到SQL服务器.

Alter table event Add id_emp INT IDENTITY(1,1)

然后,您可以将插入记录逻辑修改为

var entities = new Event{
name="d"
}
var result =  _unitOfWork.EventRepository.InsertAsync(entities , autoSave: true);
laawzig2

laawzig22#

使用此代码,有时我会因为输入的id值不唯一而出现异常(因为在select max id和insert之间的间隔中插入了一条记录)。
实际上,你得到了正确的异常,因为你错过了序列。在这种情况下,对于第一次插入,你总是会得到异常,因为当使用Max时,它需要序列,但在开始时不会有任何值,为了克服这个问题,你将需要descencing你的列表,并必须检查是否返回null。第一次它将为null,可以使用ternary operator.处理
让我们看看实际操作:
假设我有以下模型:

public class EVENT
    {
        public int id { get; set; }
        public string name { get; set; }  
    }

控制器:

[HttpPost]
        public IActionResult Create(EVENT eventModel)
        {
            if (ModelState.IsValid)
            {
                //Getting Last Inserted Id
                int lastSequence = _context.EVENTs.OrderByDescending(id => id.id).FirstOrDefault() == null ? 0 : _context.EVENTs.OrderByDescending(id => id.id).FirstOrDefault().id;

                //Creating new Id
                var newId = lastSequence + 1;
                //Binding Object
                var _objEvent = new EVENT();
                _objEvent.id = newId;
                _objEvent.name = eventModel.name;
             

                _context.EVENTs.Add(_objEvent);
                _context.SaveChanges();

            }
            return RedirectToAction("Index");
        }

**注意:**我使用null ? 0三进制来处理第一次插入时的null,因为它在开始时将为null。

输出:

相关问题