2

我从 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
        {

        }
    }

有人帮我吗?

4

5 回答 5

15

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

现在在您的情况下,类型是 aList<T>其中T是匿名类型。如果您希望能够在其他代码中使用列表元素中的属性,则需要动态地(ick)这样做或将匿名类型转换为完整的命名类型。匿名类型实际上只设计用于从创建对象的方法中使用。然后,您可以返回 aList<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()?
 }
于 2012-10-05T06:32:41.543 回答
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:查询本身可能会更好,但我只是在解决您问题中的问题。

于 2012-10-05T08:58:42.260 回答
0

您不能从方法返回匿名类型(也许有一些非常技术性的解决方法)。

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

于 2012-10-05T06:32:10.607 回答
0

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

select new CustomClass
{
    Propery1 = YourSelectedPropery1
    , Propery2 = YourSelectedPropery2
}
于 2012-10-05T06:32:34.133 回答
0

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

将方法签名更改为:

public List<TReturn> getlist<TReturn>() 

并将您的更改ToList<ClassName>()ToList<TReturn>.

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

于 2012-10-05T07:01:09.897 回答