给定一个简单的继承层次结构:人员 - >学生,教师,员工
假设我有一个人员名单,L.在该名单中有一些学生,教师和工作人员.
使用LINQ和C#,有没有办法可以编写一个只能检索特定类型的人的方法?
我知道我可以这样做:
var peopleIWant = L.OfType< Teacher >();
Run Code Online (Sandbox Code Playgroud)
但我希望能够做一些更有活力的事情.我想编写一个方法来检索我能想到的任何类型的Person的结果,而不必为每种可能的类型编写方法.
(注意:这适用于MS SQL Server)
假设您有一个带有主键标识列和CODE列的表ABC.我们希望这里的每一行都有一个独特的,顺序生成的代码(基于一些典型的校验位公式).
假设您有另一个表DEF只有一行,它存储下一个可用的CODE(想象一个简单的自动编号).
我知道下面的逻辑会出现竞争条件,其中两个用户最终会得到相同的代码:
1) Run a select query to grab next available code from DEF
2) Insert said code into table ABC
3) Increment the value in DEF so it's not re-used.
Run Code Online (Sandbox Code Playgroud)
我知道,两个用户可能会陷入第1步),最终可能会在ABC表中找到相同的CODE.
处理这种情况的最佳方法是什么?我以为我可以围绕这个逻辑包装一个"begin tran"/"commit tran",但我认为这不起作用.我有一个这样的存储过程来测试,但是当我从MS中的两个不同窗口运行时,我没有避免竞争条件:
begin tran
declare @x int
select @x= nextcode FROM def
waitfor delay '00:00:15'
update def set nextcode = nextcode + 1
select @x
commit tran
Run Code Online (Sandbox Code Playgroud)
有人可以对此有所了解吗?我认为该事务将阻止其他用户在第一个事务完成之前能够访问我的NextCodeTable,但我想我对事务的理解是有缺陷的.
编辑:我尝试将等待移到"更新"声明后,我有两个不同的代码...但我怀疑.我在那里有waitfor声明来模拟延迟,因此可以很容易地看到竞争条件.我认为关键问题是我对交易如何运作的错误认识.
我经常是SQL Server Management Studio用户.有时我会遇到更新或删除查询要运行的情况,但我担心我的一些拼写错误或逻辑错误会导致我对表进行不必要的大规模更改(比如更改1000行时)我打算改变2).
在过去,我只是握紧拳头并屏住呼吸,但后来我想知道在遇到可能的灾难性查询之前我是否可以做这样的事情:
1)在下面运行
begin transaction
(my update/insert/delete statement I want to run)
Run Code Online (Sandbox Code Playgroud)
2)如果我满意,请致电:
commit transaction
Run Code Online (Sandbox Code Playgroud)
3)或者,如果我犯了什么罪,请致电:
rollback transaction
Run Code Online (Sandbox Code Playgroud)
我的想法是否合理,还是我错过了一些基本的东西?我知道我总是可以恢复我的数据库,但与上面相比,这似乎有些过分.
EDITS:
1)我同意在做任何事情之前在测试站点上进行测试,但是仍然有可能在生产服务器上发生问题.也许某些条件在测试服务器上是正确的,这在生产中是不正确的.
2)我也习惯先写我的地方,或者先用我的地方做一个选择,以确保我隔离正确的行,但同样,总会出现问题.