2016-06-14 127 views
0

我已经筛选了一个List<Application>使用Linq来连接该列表中的两个字段并返回一个结果,现在需要将该列表返回给调用方法。如何将IEnumerable <AnonymousType>转换为列表<T>?

从LINQ的滤波的结果是IEnumerable<AnonymousType>型的,所以我不能返回原样我的方法返回类型为List<Application>

我也尝试起先是使用ToList方法将IEnumerable的转换,但抛出一个编译器错误:

IEnumerable does not contain a definition for ToList() 

问:

我如何转换或投一个IEnumerable到一个列表 ?

代码:

该分配进行的列表来连接两个字段并恢复它作为一个清单:

   var filteredAppList = applicationList.Select(c => new { c.RID, RID_APP_FIELD = c.RID + " " + c.BusinessFriendlyName }); 

而下面是我尝试返回了IEnumerable作为清单:

   return filteredAppList.ToList<Application>(); 
+0

你为什么想要转换回应用程序类? –

+2

您的所有对象都不是* Application对象。它们是匿名类型的实例。做你想做的事本质上就是做'.Select(x => new Application {RID = x.RID,...})'等 - 手动或自动化;你为什么要切换到一个匿名类型,如果你想'Application'实例? –

+0

'RID_APP_FIELD'是'Application'中的一个属性吗?如果不是,则必须使其成为一个或以这种方式覆盖'ToString':'返回RID +“”+ BusinessFriendlyName'。然后你不需要创建新的实例,但是你可以返回'applicationList.Where(conditions).ToList()' –

回答

3

的问题是,以前的查询返回的序列匿名对象,我们试图将它们转换为Application类型。这是造成这个问题,试试这个。

filteredAppList.Select(x=> new Application() 
          { 
           // set properties. 

          }) 
       .ToList(); 
+0

我需要返回格式为“RID + BusinessFriendlyName”的列表,因此生成的过滤列表将如下所示:“879898 TestAppOne”等。您可以提供有关如何设置上述属性的更多详细信息? –

+0

如何定义'Application'类?您需要在这里设置应用程序属性。 –

1

如果你知道你需要返回Application对象,你应该简单地避免匿名类型:

var filteredAppList = applicationList.Select(c => new Application { RID = c.RID, RID_APP_FIELD = c.RID + " " + c.BusinessFriendlyName }); 

return filteredAppList.ToList(); 

我认为你的匿名类型是严格相同的Application类型,但可能不会是这样的。您仍然可以在中间步骤中使用匿名类型,但运行时几乎无法将您的匿名类型自动转换为Application,因此重新投影到所需类型的实例几乎是您唯一的选择。

var filteredAppList = applicationList.Select(c => new { RID = c.RID, RID_APP_FIELD = c.RID + " " + c.BusinessFriendlyName }); 

return filteredAppList.Select(anon => new Application { RID = anon.RID, OtherApplicationProperty = anon.RID_APP_FIELD }).ToList(); 
相关问题