如果我尝试这样做,它将起作用:
var query = myContextObject.Users.Where(u=>u.Name == "John");
query.ToList();
我可以调用
ToList
和许多其他扩展方法。但是,如果我尝试这样做:
public List ConvertQueryToList(IQueryable query)
{
return query.ToList();
}
ToList
无法访问,我猜这是因为ToList
是扩展方法,但是在第一个示例中如何附加ToList
?在第二种情况下可以访问
ToList
吗? 最佳答案
您需要将其编写为:
public List<T> ConvertQueryToList<T>(IQueryable<T> query)
{
return query.ToList();
}
这将导致
IQueryable<T>
返回适当的List<T>
,因为 Enumerable.ToList()
方法需要IEnumerable<T>
作为输入(也可以与IQueryable<T>
一起用作 IQueryable<T>
inherits IEnumerable<T>
)。话虽如此,实际上没有理由以这种方式使用它。如果您需要创建
ToList()
,则始终可以直接直接调用List<T>
-在第二层内部进行抽象只会进一步混淆API。如果您尝试转换非通用的IQueryable接口(interface),则需要执行以下操作:
public List<T> ConvertQueryToList<T>(IQueryable query)
{
return query.Cast<T>.ToList();
}
然后,这将需要调用,例如:
var results = ConvertQueryToList<SomeType>(queryable);
或者,如果您想保留此非泛型(我不建议这样做),则可以使用:
public ArrayList ConvertQueryToList(IQueryable query)
{
ArrayList results = new ArrayList();
results.AddRange(query.Cast<object>().ToList());
return results;
}
关于c# - ToList()方法在哪里? (可查询),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12254855/