可以列出的IQueryable

我正在使用System.Linq.Dynamic来允许我从查询中动态选择字段列表,如下所示:

finalQuery = query.Select(string.Format("new({0})", string.Join(",", selectors))); 

selectors只是一个List ,包含我想要的所有字段。 这很好用,但是这个版本的扩展方法Select返回一个IQueryable 。 这不是 IQueryable 。 如果我有一个IQueryable我可以简单地做一个.ToList()将它转换成一个列表并强制查询实际在数据库上运行,但是使用非genericsIQueryable ,该方法不存在。

这是因为ToListinheritance自IEnumerableIQueryableinheritance而且IQueryable显然不会。

那么获得IQueryable执行查询并给我一个列表的最有效方法是什么? 我可以做这个:

 List rtn = new List(); foreach (var o in finalQuery) { rtn.Add(o); } 

但似乎他们应该是一种更容易的方式。

编辑:为了回应建议,我尝试了两个:

 finalQuery.Cast().ToList(); 

和:

 finalQuery.Cast().ToList(); 

这两个都给NotSupportedExceptions提供了消息:

 Unable to cast the type 'DynamicClass1' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types. 

这似乎是LINQ to Entities使用匿名类型转换IQueryable.Cast的方式的限制。 您可以通过将其用作IEnumerable来解决此问题(您的工作示例IEnumerable )。 这会导致代码在从DB运行时检索在.NET运行时执行转换,而不是尝试在数据库引擎中处理它。 例如

 IEnumerable finalQuery = query.Select(string.Format("new({0})", string.Join(",", selectors))); var result = finalQuery.Cast().ToList(); 

要么

 public static IList CastToList(this IEnumerable source) { return new List(source.Cast()); } var finalQuery = query.Select(string.Format("new({0})", string.Join(",", selectors))); var result = finalQuery.CastToList();