智商可以列出

本文关键字: | 更新日期: 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>();
相关文章:
  • 没有找到相关文章