智商可以列出
本文关键字: | 更新日期: 2023-09-27 18:19:05
我正在使用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
是从IQueryable<T>
继承的IEnumerable<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.
这
似乎是 LINQ to Entities 使用匿名类型转换IQueryable.Cast
的方式的限制。您可以通过将其用作IEnumerable
来解决此问题(您的工作示例执行此操作(。这会导致代码在从数据库检索后在 .NET 运行时中执行强制转换,而不是尝试在数据库引擎中处理它。例如
IEnumerable finalQuery = query.Select(string.Format("new({0})",
string.Join(",", selectors)));
var result = finalQuery.Cast<dynamic>().ToList();
或
public static IList<T> CastToList<T>(this IEnumerable source)
{
return new List<T>(source.Cast<T>());
}
var finalQuery = query.Select(string.Format("new({0})",
string.Join(",", selectors)));
var result = finalQuery.CastToList<dynamic>();