gpt4 book ai didi

c# - IQueryable 列表

转载 作者:太空狗 更新时间:2023-10-29 18:11:58 25 4
gpt4 key购买 nike

我正在使用 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.

最佳答案

这似乎是 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>();

关于c# - IQueryable 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25453212/

25 4 0