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