Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ToList()方法在哪里?(可查询)_C#_.net_Linq_Extension Methods - Fatal编程技术网

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

C# ToList()方法在哪里?(可查询),c#,.net,linq,extension-methods,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是一种扩展方法,但是在第一个示

如果我尝试此方法,它将起作用:

var query = myContextObject.Users.Where(u=>u.Name == "John");
query.ToList();
我能够调用
ToList
和许多其他扩展方法

但如果我尝试这样做:

public List ConvertQueryToList(IQueryable query)
{
    return query.ToList();
}
ToList
将不可访问,我猜这是因为
ToList
是一种扩展方法,但是在第一个示例中如何附加
ToList

在第二种情况下是否可以访问
ToList

第一个示例返回一个
IQueryable
,而在第二种情况下,您使用的是
IQueryable
(不带泛型类型参数)


您可以查看两个完全不同的接口,并且。

您需要将其编写为:

public List<T> ConvertQueryToList<T>(IQueryable<T> query)
{
    return query.ToList();
}
这就需要像这样的调用:

var results = ConvertQueryToList<SomeType>(queryable);
var results=ConvertQueryToList(可查询);
或者,如果您想保留此非通用(我不推荐),则可以使用:

public ArrayList ConvertQueryToList(IQueryable query)
{
    ArrayList results = new ArrayList();
    results.AddRange(query.Cast<object>().ToList());
    return results;
}
public ArrayList convertQueryList(iQueryTable查询)
{
ArrayList结果=新建ArrayList();
results.AddRange(query.Cast().ToList());
返回结果;
}

以下是一种扩展方法:

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

下面是您正在使用IQueryable的案例的通用扩展方法。 当然,它不是绝对安全的,因为类型可能错误,类型转换可能失败。所以,如果你使用这种方法,请小心

使用System.Collections.Generic;
名称空间系统.Linq
{
公共静态类扩展
{
公共静态列表列表(此IQueryable可查询)
{
return((IQueryable)queryable.ToList();
}
}
}

注意:
var查询
!=
iQueryable查询
。我见过的一个地方是用于LINQtoSQL的动态linq提供程序。由于动态linq提供程序将字符串作为参数,因此它没有可处理的类型。我不想抽象“ToList”,我的目的只是使我的问题更容易解释。谢谢你提供的所有信息@根据这个问题,marcos.borunda不确定你的目标到底是什么。不过,我试着在这里介绍三个主要选项-现在有意义了吗?在cast方法和arraylist方法之间的某个地方是
query.cast.ToList()
。这基本上是一种强制转换方法,但由于所有内容都可以强制转换为
对象
,因此它可以与任何
IQueryable
@JonHanna一起工作是的-因此,您将得到一个
列表
。我想把它包括在内,但这似乎是一种奇怪的方法,最后一个例子实际上并不起作用
ArrayList.AddRange
需要一个
ICollection
,而
IQueryable
不是。您应该描述作者为什么不能在第二个截取的代码中使用
ToList
。你的答案可能有效,但并没有暗示问题的根源。这让我找到了正确的方向。使用“query.Cast().ToList()”可以获得相同的结果。
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 });
    }
}