Awk*_*der 9 t-sql nhibernate icriteria
我可以使用Criteria执行t-sql命令来选择表中列的最大值吗?
'从客户中选择@cus_id = max(id)+ 1'
钽
奥利
Chs*_*y76 23
使用投影:
session.CreateCriteria(typeof(Customer))
.SetProjection( Projections.Max("Id") )
. UniqueResult();
Run Code Online (Sandbox Code Playgroud)
tpd*_*pdi 15
Max(id)+ 1是生成id的一种非常糟糕的方法.如果这是您的目标,请找到另一种生成ID的方法.
编辑:回答LnDCobra:
这很糟糕,因为当你进行插入时很难确保你得到的max(id)仍然是max(id).如果另一个进程插入一行,您的插入将具有相同的ID,并且您的插入将失败.(或者,相反,如果您的插入首先发生,则其他进程的插入将失败.)
为了防止这种情况,你必须阻止任何其他插入/使你的get和后续插入原子,这通常意味着锁定表,这将损害性能.
如果您只锁定写入,则另一个进程获得max(id),这与您获得的max(id)相同.您执行插入并释放锁定,它会插入重复的ID并失败.或者它也试图锁定,在这种情况下它会等你.如果你也锁定读取,每个人都在等你.如果它也锁定写入,那么它不会插入重复的id,但它会等待你的读取和写入.
(它打破了封装:你应该让rdbms找出它的ID,而不是连接到它的客户端程序.)
通常,这种策略要么:
*break
*需要一堆"管道"代码才能使其工作
*显着降低性能
*或全部三
它将比使用RDBMS的内置序列或生成的自动增量ID更慢,更不健壮,并且需要更难维护的代码.