【问题标题】:Return var from function从函数返回 var
【发布时间】:2012-09-26 06:48:20
【问题描述】:

我从 var 类型的不同表中获取值,我想返回它们。函数的返回类型应该是什么:-

  public void getlist()
    {
        try
        {
            using (ShowDataToClientDataContext c = new ShowDataToClientDataContext())
            {
               var recList = (from record in c.GetTable<T_RECORDSHOW>()
                              where record.RecordStatus.Equals(RecordStatus.Active)
                              select new
                              {
                                  Student = (from stu in c.T_STUDENTSHOWs
                                             where stu.Id.Equals(record.StudentId)
                                             select stu.Name).Single().ToString(),
                                  Trade = (from t in c.T_TRADESHOWs
                                           where t.Id.Equals(record.TradeId)
                                           select t.Name).Single().ToString(),
                                  SessionId = (from s in c.T_SESSIONSHOWs
                                               where s.Id.Equals(record.SessionId)
                                               select s.Name).Single().ToString(),
                                  Month = record.Month.ToString(),
                                  Attendance = record.Attendance.ToString(),

                              }).ToList();
               return recList;
            }

        }
        catch
        {

        }
    }

有人帮我吗?

【问题讨论】:

    标签: c# asp.net linq var


    【解决方案1】:

    var 本身并不是一个类型。它只是要求编译器推断局部变量的类型。

    现在,在您的情况下,类型是 List&lt;T&gt;,其中 T 是匿名类型。如果您希望能够在其他代码中使用列表元素中的属性,则需要动态地(ick)这样做,或者将匿名类型转换为完整的命名类型。匿名类型实际上只设计用于从创建对象的方法中使用。然后,您可以返回 List&lt;DenormalizedRecord&gt; 或其他任何内容。

    另请注意,如果您只使用连接,您的查询会更简单:

     from record in c.GetTable<T_RECORDSHOW>()
     where record.RecordStatus.Equals(RecordStatus.Active)
     join student in c.T_STUDENTSHOWs on record.StudentId equals student.Id
     join trade in c.T_TRADESHOWs on record.TradeId equals trade.Id
     join session in c.T_SESSIONSHOWs on record.SessionId equals session.Id
     select new DenormalizedRecord {
         Student = student.Name,
         Trade = trade.Name,
         SessionId = session.Name, // Confusing property name, by the way
         Month = record.Month.ToString(), // Why the ToString()?
         Attendance = record.Attendance.ToString() // What the ToString()?
     }
    

    【讨论】:

      【解决方案2】:

      您不能从方法中返回匿名类型并不完全正确,我并不是说使用带有反射的棘手的东西。您只需将实例化的负担转移给调用者即可:

      IEnumerable<T> getlist<T>(Func<string, string, string, string, string, T> resultor)
      {
          try
          {
              using (ShowDataToClientDataContext c = new ShowDataToClientDataContext())
              {
                 var recList = (from record in c.GetTable<T_RECORDSHOW>()
                                where record.RecordStatus.Equals(RecordStatus.Active)
                                select resultor
                                (
                                    (from stu in c.T_STUDENTSHOWs
                                               where stu.Id.Equals(record.StudentId)
                                               select stu.Name).Single().ToString(),
                                    (from t in c.T_TRADESHOWs
                                             where t.Id.Equals(record.TradeId)
                                             select t.Name).Single().ToString(),
                                    (from s in c.T_SESSIONSHOWs
                                                 where s.Id.Equals(record.SessionId)
                                                 select s.Name).Single().ToString(),
                                    record.Month.ToString(),
                                    record.Attendance.ToString()
                                )).ToList();
                 return recList;
              }
      
          }
          catch
          {
      
          }
      }
      

      类型推断就像一个魅力,所以你可以这样调用你的方法:

      var list = getlist((st, tr, sid, m, att) => new 
      { 
          Student = st,
          Trade = tr,
          SessionId = sid,
          Month = m,
          Attendance = att 
      });
      

      无需为了输出这些结果而定义任何 DTO 类。

      PS:查询本身可能会更好,但我只是在解决您问题中的问题。

      【讨论】:

        【解决方案3】:

        您不能从方法中返回 anonymous type(也许有一些非常技术性的解决方法)。

        您可能应该创建一个具有您想要返回的属性的类,然后返回该类的一个对象。

        【讨论】:

          【解决方案4】:

          创建一个自定义类。使用它作为返回类型

          select new CustomClass
          {
              Propery1 = YourSelectedPropery1
              , Propery2 = YourSelectedPropery2
          }
          

          【讨论】:

            【解决方案5】:

            我注意到您可以使用一些通用参数来解决您的问题。

            将方法签名更改为:

            public List<TReturn> getlist<TReturn>() 
            

            并将您的 ToList&lt;ClassName&gt;() 更改为 ToList&lt;TReturn&gt;

            这将使您的方法能够返回任何类型的列表(当然,您的模型支持!)。

            【讨论】:

              猜你喜欢
              • 2013-06-14
              • 1970-01-01
              • 2019-08-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多