以下是方法:
public IEnumerable<???> GetAllSiteVisits()
{
var visits =
_db.STEWARDSHIP
.OrderByDescending(r => r.VISIT_DATE)
.Select(r => new
{
id = r.STEWARDSHIP_ID,
name = r.SITE.SITE_NAME,
visit_date = r.VISIT_DATE,
visit_type = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC
});
return visits;
}
我正在使用Entity Framework 4.2
。
所以问题在于找出返回类型。如果我只是直接使用数据库表中的信息,我会返回IEnumerable<STEWARDSHIP>
,但由于我只选择某些字段,我不明白返回类型是什么。
答案 0 :(得分:8)
返回类型将是AnonymousType
的集合,其中每个项目代表具有以下属性的类:
id
(带有r.STEWARDSHIP_ID的类型)name
(包含r.SITE.SITE_NAME的类型)visit_date
(类型为r.VISIT_DATE)visit_type
(类型为r.VISIT_TYPE_VAL.VISIT_TYPE_DESC)然后,您可以使用foreach
循环遍历元素:
foreach(var item in visits)
{
string visitInfo = String.Format(
CultureInfo.InvariantCulture,
"Id: {0}, Name: {1}, Date: {2}, Type: {3}",
item.id,
item.name,
item.visit_date,
item = visit_type);
Debug.WriteLine(visitInfo);
}
如果需要从方法返回查询结果,可以引入一个代表这些前置属性的新类:
// TODO: update types of the properties
class VisitDetails
{
public string Id { get; private set; }
public string Name { get; private set; }
public DateTime VisitDate { get; private set; }
public string VisitType { get; private set; }
}
更新查询以创建VisitDetails实例而不是匿名类型:
.Select(r => new VisitDetails
{
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitDate = r.VISIT_DATE,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC
});
这样返回类型将是IEnumerable<VisitDetails>
,因此您甚至可以通过指定确切的返回类型来轻松地从方法返回查询本身的结果,因此代码将非常干净。
有关详细信息,请参阅Object Initializers with anonymous types。
答案 1 :(得分:2)
你将无法,它返回一个匿名类型。请阅读有关此主题的the MSDN documentation。
一种替代方法是使用具有
的类创建具体实现作为属性
答案 2 :(得分:2)
您不能将AnonymousType作为方法的返回值返回。您必须创建一个在linq中填充的类型:
public IEnumerable<SiteVisit> GetAllSiteVisits()
{
var visits =
_db.STEWARDSHIP
.OrderByDescending(r => r.VISIT_DATE)
.Select(r => new SiteVisit
{
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitDate = r.VISIT_DATE,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC
});
return visits;
}