Как можно улучшить производительность выражений запросов Linq?

 public bool SaveValidTicketNos(string id,string[] ticketNos, string checkType, string checkMan)
        {
            bool result = false;
            List<Carstartlistticket>enties=new List<Carstartlistticket>();
            using (var context = new MiniSysDataContext())
            {
                try
                {
                    foreach (var ticketNo in ticketNos)
                    {
                        Orderticket temp = context.Orderticket.ByTicketNo(ticketNo).SingleOrDefault();
                        if (temp != null)
                        {
                            Ticketline ticketline= temp.Ticketline;
                            string currencyType = temp.CurrencyType;
                            float personAllowance=GetPersonCountAllowance(context,ticketline, currencyType);
                            Carstartlistticket carstartlistticket = new Carstartlistticket()
                                                                        {
                                                                            CsltId = Guid.NewGuid().ToString(),
                                                                            Carstartlist = new Carstartlist(){CslId = id},
                                                                            LeaveDate = temp.LeaveDate,
                                                                            OnPointName = temp.OnpointName,
                                                                            OffPointName = temp.OffpointName,
                                                                            OutTicketMan = temp.OutBy,
                                                                            TicketNo = temp.TicketNo,
                                                                            ChekMan = checkMan,
                                                                            Type = string.IsNullOrEmpty(checkType)?(short?)null:Convert.ToInt16(checkType),
                                                                            CreatedOn = DateTime.Now,
                                                                            CreatedBy = checkMan,
                                                                            NumbserAllowance = personAllowance
                                                                        };
                            enties.Add(carstartlistticket);
                        }
                    }

                    context.BeginTransaction();
                    context.Carstartlistticket.InsertAllOnSubmit(enties);
                    context.SubmitChanges();
                    bool changeStateResult=ChangeTicketState(context, ticketNos,checkMan);
                    if(changeStateResult)
                    {
                        context.CommitTransaction();
                        result = true;
                    }
                    else
                    {
                        context.RollbackTransaction();
                    }
                }
                catch (Exception e)
                {
                    LogHelper.WriteLog(string.Format("CarstartlistService.SaveValidTicketNos({0},{1},{2},{3})",id,ticketNos,checkType,checkMan),e);
                    context.RollbackTransaction();
                }
            }
            return result;
        }

Мой код выше. Я сомневаюсь, что у этого кода ужасно плохая производительность. Низкая производительность в точке

Orderticket temp = context.Orderticket.ByTicketNo(ticketNo).SingleOrDefault();

, на самом деле, я получил строковый массив через метод args, затем я хочу получить все данные по ticketNos из базы данных, здесь я использую цикл, я знаю, что если я напишу свой код таким образом, возникнет проблема производительности, и это будет привести еще раз доступ к базе данных, как избежать этой проблемы и улучшить производительность кода, например, получить все данные только при доступе к базе данных. Я забыл вам сказать, что ORM я использую, например, ORM на основе NHibernate на основе PlinqO

я с нетерпением жду вашего ответа, спасибо

1 ответ

Решение

Используя простой NHibernate

var tickets = session.QueryOver<OrderTicket>()
    .WhereRestrictionOn(x => x.TicketNo).IsIn(ticketNos)
    .List();

short? type = null;
short typeValue;
if (!string.IsNullOrEmpty(checkType) && short.TryParse(checkType, out typeValue))
    type = typeValue;

var entitiesToSave = tickets.Select(ticket => new Carstartlistticket
{
    CsltId = Guid.NewGuid().ToString(),
    Carstartlist = new Carstartlist() { CslId = id },
    LeaveDate = ticket.LeaveDate,
    OnPointName = ticket.OnpointName,
    OffPointName = ticket.OffpointName,
    OutTicketMan = ticket.OutBy,
    TicketNo = ticket.TicketNo,
    ChekMan = checkMan,
    CreatedOn = DateTime.Now,
    CreatedBy = checkMan,
    Type = type,
    NumbserAllowance = GetPersonCountAllowance(context, ticket.Ticketline, ticket.CurrencyType)
});

foreach (var entity in entitiesToSave)
{
    session.Save(entity);
}

чтобы улучшить это, попробуйте предварительно загрузить все необходимые PersonCountAllowances

Другие вопросы по тегам