How can improve this Linq query expressions performance?

99 Views Asked by At
 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;
        }

My code is above. I doubt these code have terrible poor performance. The poor performance in the point

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

,actually, I got an string array through the method args,then I want to get all data by ticketNos from database, here i use a loop,I know if i write my code like that ,there will be cause performance problem and it will lead one more time database access,how can avoid this problem and improve the code performance,for example ,geting all data by only on databse access I forget to tell you the ORM I use ,en ,the ORM is PlinqO based NHibernate

i am looking forward to having your every answer,thank you

1

There are 1 best solutions below

1
On BEST ANSWER

using plain 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);
}

to enhance this further try to preload all needed PersonCountAllowances