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
,因为IQueryable
inheritanceIEnumerable
)。
话虽如此,实际上没有理由以这种方式使用它。 如果需要创建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
第一个示例返回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 }); } }