【问题标题】:return one record from IQueryable query从 IQueryable 查询返回一条记录
【发布时间】:2016-08-12 07:24:39
【问题描述】:

大家好,我有这个问题

  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
                   };

        }

这个查询产生多个记录,但我只需要第一个,如何将第一个值返回为 IQueryable

【问题讨论】:

    标签: c# entity-framework iqueryable


    【解决方案1】:

    只需添加.First().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();
    

    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 将返回第一个,或者如果没有 Default(T),如果它是类对象,则通常为 null...

    因此,将其作为 IQueryable 在我看来并不喜欢这样做:

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

    【讨论】:

    • 输出应该是 IQueryable 只有一条记录
    • 您的查询只返回一个 HeaderMRC 对象
    • 为什么需要它作为 IQueryable?只有一张唱片?这没有意义?
    • @CallumLinington 如果我无法更改方法的定义怎么办?
    【解决方案2】:

    只需用() 括起您的查询并附加Take(1),这是FirstOrDefault 的集合等效项:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多