【发布时间】:2014-08-22 18:14:25
【问题描述】:
我使用System.Linq.Dynamic 允许我从这样的查询中动态选择字段列表:
finalQuery = query.Select(string.Format("new({0})", string.Join(",", selectors)));
selectors 只是一个 List<string>,其中包含我想要的所有字段。这很好用,但是这个版本的扩展方法Select 返回一个IQueryable。这不是不是IQueryable<T>。如果我有IQueryable<T>,我可以简单地执行.ToList() 将其转换为列表并强制查询在数据库上实际运行,但对于非通用IQueryable,该方法不存在。
这是因为ToList 继承自IEnumerable<T>,IQueryable<T> 继承而IQueryable 显然没有。
那么让IQueryable 执行查询并返回列表的最有效方法是什么?我可以这样做:
List<object> rtn = new List<object>();
foreach (var o in finalQuery)
{
rtn.Add(o);
}
但似乎他们应该是一种更简单的方法。
编辑:根据建议,我都尝试了:
finalQuery.Cast<object>().ToList();
和:
finalQuery.Cast<dynamic>().ToList();
两者都给NotSupportedExceptions 发送消息:
Unable to cast the type 'DynamicClass1' to type 'System.Object'. LINQ to Entities
only supports casting EDM primitive or enumeration types.
【问题讨论】:
-
您尝试过 Cast 吗? msdn.microsoft.com/en-us/library/vstudio/…
-
@MikeCheel 你打算把它投射到什么地方?
-
好点忘了它的动态
-
@MikeCheel:我尝试投射到
object,但它根本不喜欢那样。NotSupportedException, "无法将类型 'DynamicClass1' 转换为类型 'System.Object'"