我从不同的表中获取值我的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
{
}
}
有人帮我吗?
答案 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>
。
这将使您的方法能够返回任何类型的列表(当然,您的模型支持!)。