ToList()方法在哪里? (IQueryable的)

如果我试试这个,它会起作用:

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 ConvertQueryToList(IQueryable query) { return query.ToList(); } 

这将导致IQueryable返回相应的List ,因为Enumerable.ToList()方法需要IEnumerable作为输入(也适用于IQueryable ,因为IQueryableinheritanceIEnumerable )。

话虽如此,实际上没有理由以这种方式使用它。 如果需要创建List您可以直接调用ToList() – 在第二层内部进行抽象只会进一步混淆API。

如果您正在尝试转换非通用的IQueryable接口,则需要执行以下操作:

 public List ConvertQueryToList(IQueryable query) { return query.Cast.ToList(); } 

这将需要调用如下:

 var results = ConvertQueryToList(queryable); 

或者,如果你想保留这种非generics(我不推荐),那么你可以使用:

 public ArrayList ConvertQueryToList(IQueryable query) { ArrayList results = new ArrayList(); results.AddRange(query.Cast().ToList()); return results; } 

第一个示例返回IQueryable ,而在第二个示例中,您使用IQueryable (没有Generic Type参数)。

您可以在此处和此处查看两个完全不同的界面。

这是一个扩展方法:

 public static class ListHelper { public static IList ToList(this IQueryable query) { var genericToList = typeof(Enumerable).GetMethod("ToList") .MakeGenericMethod(new Type[] { query.ElementType }); return (IList)genericToList.Invoke(null, new[] { query }); } }