从函数返回var

时间:2012-10-05 06:30:16

标签: c# asp.net linq var

我从不同的表中获取值我的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
        {

        }
    }

有人帮我吗?

5 个答案:

答案 0 :(得分:15)

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

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

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

 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()?
 }

答案 1 :(得分: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:查询本身可能会更好,但我只是解决你问题中的问题。

答案 2 :(得分:0)

您无法从方法中返回anonymous type(可能需要一些非常技术性的解决方法)。

您应该创建一个包含要返回的属性的类,然后返回该类的对象。

答案 3 :(得分:0)

创建自定义类。将其用作返回类型

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

答案 4 :(得分:0)

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

将方法签名更改为:

public List<TReturn> getlist<TReturn>() 

并将ToList<ClassName>()更改为ToList<TReturn>

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