.net ToList()方法在哪里?(IQueryable)

k2fxgqgv  于 2023-03-13  发布在  .NET
关注(0)|答案(4)|浏览(195)

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

var query = myContextObject.Users.Where(u=>u.Name == "John");
query.ToList();

我可以调用ToList和许多其他扩展方法。
但如果我试试这个:

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

ToList将不可访问,我猜这是因为ToList是一个扩展方法,但是在第一个示例中ToList是如何附加的?在第二个示例中是否可以访问ToList

3z6pesqy

3z6pesqy1#

您需要将其编写为:

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>)。
话虽如此,实际上没有理由这样使用它,如果你需要创建一个List<T>,你可以直接调用ToList()--在第二层中抽象只会进一步混淆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;
}
quhf5bfb

quhf5bfb2#

第一个示例返回IQueryable<T>,而在第二个示例中使用IQueryable(不带泛型类型参数)。
您可以查看两个完全不同的接口herehere

f0brbegy

f0brbegy3#

下面是一个扩展方法:

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 });
    }
}
ibps3vxo

ibps3vxo4#

下面是一个通用扩展方法,适用于使用IQueryable<<T>>的情况。
当然,它不是绝对安全的,因为类型可能是错误的,强制转换可能会失败。所以,如果你使用这种方法,请小心。

using System.Collections.Generic;
  
namespace System.Linq
{
    public static class Extensions
    {
        public static List<T> ToList<T>(this IQueryable queryable)
        {
            return ((IQueryable<T>)queryable).ToList();
        }
    }
}

相关问题