需要帮助找出返回类型

2 .net c# linq entity-framework-4

这是方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Entity Framework 4.2.

所以问题在于找出返回类型.如果我只是直接从数据库表中使用信息,我会返回,IEnumerable<STEWARDSHIP>但由于我只选择某些字段,我不明白返回类型是什么.

sll*_*sll 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);       
}
Run Code Online (Sandbox Code Playgroud)

如果需要从方法返回查询结果,可以引入一个表示这些前置属性的新类:

// 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; }
}
Run Code Online (Sandbox Code Playgroud)

并更新查询以创建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                  
    });   
Run Code Online (Sandbox Code Playgroud)

以这种方式返回类型将使IEnumerable<VisitDetails>您甚至可以通过指定确切的返回类型来轻松地从方法返回查询本身的结果,因此代码将非常干净.

有关更多详细信息,请参阅具有匿名类型的Object Initializers.