如果我尝试这样做,它将起作用:

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/

10-13 00:00