c# - ToList() 方法在哪里? (可查询)

标签 c# .net linq extension-methods

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

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界面,您需要执行以下操作:

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/

相关文章:

c# - 带有 firefox 3.6 的 ajax modalpopupextender 显示在页面底部

c# - 更新后 ServiceBusTrigger 不工作

.net - EventToCommand 使参数保持最新

c# - System.Console 不包含的定义

C# LINQ 查询

c# - 如何使用循环简化 GameObject 按键代码?

c# - 如何从 TypeInfo 获取声明和继承的成员

c# - 将 CollectionViewSource 绑定(bind)到 ListBox

c# - 方向取决于数据时的 OrderByWithDirection

c# - 将 Let 与 LINQ 结合使用时如何避免重新创建对象