var query = new Query(Tables.Ticket) {QueryType = QueryType.Update};
query.WHERE(Ticket.Columns.IsDeleted, false);
query.AND(Ticket.Columns.IsSold, false);
query.AND(Ticket.Columns.SeatId, Comparison.In, seats);
query.AddUpdateSetting(Ticket.Columns.Price, 123);
query.Execute();
如果“席位”是具有2000个项目的列表,此查询是否写得不好?
答案 0 :(得分:1)
我的数据库是MySQL,所以我只能谈论它,但性能仍然适用于这类查询(取决于你的情况下的慢查询。我的代码可以查询具有160000记录的表甚至使用在不到3秒的时间内SELECT * FROM table WHERE id IN(1,2,3,...159999)
)。这种情况下的瓶颈是通过网络传输大型查询,但这在本地局域网中并不是什么大问题。
如果您可以从另一个表中查询seatids,您甚至可以通过服务器端执行(子查询)来提高性能。
SubSonic.SqlQuery subQuery = DB
.Select(Seats.Columns.Id)
.From<Seats>()
.Where(Seat.Columns.Type).IsEqualTo(1);
// translates to
// UPDATE tickets SET price = 123
// WHERE seatid IN (SELECT id FROM seats WHERE type = 1)
DB.Update<Tickets>()
.Set(Tickets.Columns.Price).EqualTo(123)
.Where(Tickets.Columns.SeatId).In(subQuery)
.Execute();
// translates to
// UPDATE tickets SET price = 123
// WHERE seatid IN (1,3,5,7,...,2000)
DB.Update<Tickets>()
.Set(Tickets.Columns.Price).EqualTo(123)
.Where(Tickets.Columns.SeatId).In(subQuery.ToList<int>())
.Execute();