C# 在Queryable类中使用Count方法时出现异常

C# 在Queryable类中使用Count方法时出现异常,c#,count,windows-runtime,iqueryable,C#,Count,Windows Runtime,Iqueryable,在WinRT中,当我为IOrderedEnumerable实例调用Queryable类中的count方法时,它将抛出异常 DoWork(emp); //Working fine DoWork(emp.OrderBy(objects => objects.EmployeeId)); //throw exception.. public void DoWork(IEnumerable<object> collection) { var queryable = colle

WinRT中,当我为IOrderedEnumerable实例调用Queryable类中的count方法时,它将抛出异常

DoWork(emp); //Working fine 
DoWork(emp.OrderBy(objects => objects.EmployeeId)); //throw exception..

public void DoWork(IEnumerable<object> collection)
{
    var queryable = collection.AsQueryable();
    int count = 0;
    if (queryable != null)
        count = queryable.Count();
    else
        throw new InvalidOperationException("Not able to get count");

    //Some other operations using queryable...
}

您必须使用
iorrerable
而不是
IEnumerable
作为
DoWork
方法的参数

i可降级:

IEnumerable:


似乎
IOrderedEnumerable.AsQueryable()
是使用WinRT中不可用的动态代码生成来实现的。您可以通过在调用
AsQueryable()
之前在列表中具体化它来解决这个问题:

public void DoWork(IEnumerable集合)
{
var queryable=collection.ToList().AsQueryable();
整数计数=0;
if(可查询!=null)
count=queryable.count();
其他的
抛出新的InvalidOperationException(“无法获取计数”);
//其他一些使用queryable的操作。。。
}

除非您使用的是非常大的集合,否则性能不会差很多。

您的
集合是什么?@DamirArh集合是一个IEnumerable对象。它可以是列表、可观察的集合或数据表
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The API 'System.Linq.OrderedEnumerable`2[[SfDataGrid.BusinessObjects, SfDataGrid, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' cannot be used on the current platform. See http://go.microsoft.com/fwlink/?LinkId=248273 for more information.
Source=mscorlib
StackTrace:
at System.Reflection.Emit.DynamicILGenerator.GetTokenFor(RuntimeType rtType)
at System.Reflection.Emit.DynamicILGenerator.Emit(OpCode opcode, Type type)
at System.Linq.Expressions.Compiler.BoundConstants.EmitConstantFromArray(LambdaCompiler lc, Object value, Type type)
at System.Linq.Expressions.Compiler.BoundConstants.EmitConstant(LambdaCompiler lc, Object value, Type type)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitConstant(Object value, Type type)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitConstantExpression(Expression expr)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitExpression(Expression node, CompilationFlags flags)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitArguments(MethodBase method, IArgumentProvider args, Int32 skipParameters)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitMethodCall(MethodInfo mi, IArgumentProvider args, Type objectType, CompilationFlags flags)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitMethodCall(Expression obj, MethodInfo method, IArgumentProvider methodCallExpr, CompilationFlags flags)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitMethodCallExpression(Expression expr, CompilationFlags flags)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitExpression(Expression node, CompilationFlags flags)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitLambdaBody(CompilerScope parent, Boolean inlined, CompilationFlags flags)
at System.Linq.Expressions.Compiler.LambdaCompiler.EmitLambdaBody()
at System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator)
at System.Linq.EnumerableExecutor`1.Execute()
at System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.Count[TSource](IQueryable`1 source)
at SfDataGrid.ViewModel.GetCount(IEnumerable`1 collection) in e:\DiskD\Support\I108101\SfDataGrid1022101733\SfDataGrid\SfDataGrid\ViewModel\ViewModel.cs:line 39
at SfDataGrid.ViewModel..ctor() in e:\DiskD\Support\I108101\SfDataGrid1022101733\SfDataGrid\SfDataGrid\ViewModel\ViewModel.cs:line 27
at SfDataGrid.SfDataGrid_XamlTypeInfo.XamlTypeInfoProvider.Activate_0_ViewModel() in e:\DiskD\Support\I108101\SfDataGrid1022101733\SfDataGrid\SfDataGrid\obj\Debug\XamlTypeInfo.g.cs:line 123
at SfDataGrid.SfDataGrid_XamlTypeInfo.XamlUserType.ActivateInstance() in e:\DiskD\Support\I108101\SfDataGrid1022101733\SfDataGrid\SfDataGrid\obj\Debug\XamlTypeInfo.g.cs:line 3679
public void DoWork(IEnumerable<object> collection)
{
    var queryable = collection.ToList().AsQueryable();
    int count = 0;
    if (queryable != null)
        count = queryable.Count();
    else
        throw new InvalidOperationException("Not able to get count");

    //Some other operations using queryable...
}