1
 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();

如果 "seats" 是一个包含 2000 个项目的列表,那么这个查询是否写得不好?

4

1 回答 1

1

我的数据库是 MySQL,所以我只能谈论这个,但是对于这种类型的查询,性能仍然很好(取决于你的情况是什么慢查询。我的代码可以查询一个有 160000 条记录的表,甚至可以用SELECT * FROM table WHERE id IN(1,2,3,...159999)更少的时间) 3 秒)。在这种情况下,瓶颈是通过网络传输大型查询,但这在本地局域网中并不是什么大问题。

如果您可以从另一个表中查询座位 ID,您甚至可以通过服务器端执行(子查询)来提高性能。

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();
于 2012-05-15T13:54:57.723 回答