简体   繁体   中英

return one record from IQueryable query

Hi guys i have this query

  public IQueryable<HeaderMRC> ShowHeader(int MRCId)
        {
            return from m in _ctx.MaterialRequestContractorDetails
                   where m.MaterialRequestContractorId == MRCId
                   join materialRequestContractor in _ctx.MaterialRequestContractors on m.MaterialRequestContractorId equals materialRequestContractor.Id

                   join mat in _ctx.MaterialDescriptions on m.MaterialDescriptionId equals mat.Id
                   join l in _ctx.Lines on m.LineId equals l.Id
                   join s in _ctx.Sheets on l.Id equals s.LineId
                   select new HeaderMRC()
                   {
                       Code = materialRequestContractor.Code,
                       UnitArea = l.Unit,
                       LineType = l.Type,
                       RequestDate = materialRequestContractor.RequestDate
                   };

        }

This query produces more than one record but i just need the first one ,how can i return the first value as IQueryable

Just add .First() or .FirstOrDefault()

return (from m in _ctx.MaterialRequestContractorDetails
               where m.MaterialRequestContractorId == MRCId
               join materialRequestContractor in _ctx.MaterialRequestContractors on m.MaterialRequestContractorId equals materialRequestContractor.Id

               join mat in _ctx.MaterialDescriptions on m.MaterialDescriptionId equals mat.Id
               join l in _ctx.Lines on m.LineId equals l.Id
               join s in _ctx.Sheets on l.Id equals s.LineId
               select new HeaderMRC()
               {
                   Code = materialRequestContractor.Code,
                   UnitArea = l.Unit,
                   LineType = l.Type,
                   RequestDate = materialRequestContractor.RequestDate
               }).FirstOrDefault();

OR

return (from m in _ctx.MaterialRequestContractorDetails
               where m.MaterialRequestContractorId == MRCId
               join materialRequestContractor in _ctx.MaterialRequestContractors on m.MaterialRequestContractorId equals materialRequestContractor.Id

               join mat in _ctx.MaterialDescriptions on m.MaterialDescriptionId equals mat.Id
               join l in _ctx.Lines on m.LineId equals l.Id
               join s in _ctx.Sheets on l.Id equals s.LineId
               select new HeaderMRC()
               {
                   Code = materialRequestContractor.Code,
                   UnitArea = l.Unit,
                   LineType = l.Type,
                   RequestDate = materialRequestContractor.RequestDate
               }).First();

FirstOrDefault will return the first one, or if there isn't one Default(T) which is usually null if it is a class object...

So to get it as a IQueryable which doesn't seem to me like the thing to do:

return new List<HeaderMRC> { (from m in _ctx.MaterialRequestContractorDetails
               where m.MaterialRequestContractorId == MRCId
               join materialRequestContractor in _ctx.MaterialRequestContractors on m.MaterialRequestContractorId equals materialRequestContractor.Id

               join mat in _ctx.MaterialDescriptions on m.MaterialDescriptionId equals mat.Id
               join l in _ctx.Lines on m.LineId equals l.Id
               join s in _ctx.Sheets on l.Id equals s.LineId
               select new HeaderMRC()
               {
                   Code = materialRequestContractor.Code,
                   UnitArea = l.Unit,
                   LineType = l.Type,
                   RequestDate = materialRequestContractor.RequestDate
               }).FirstOrDefault() }.AsQueryable();

Just enclose your query with () and append Take(1) , which is the set equivalent of the FirstOrDefault :

return (from m in ...
        ...
        ...).Take(1);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM