LINQ表达式适用于LinqPad但不适用于C#Silverlight应用程序

时间:2010-01-20 03:04:47

标签: c# linq silverlight linq-to-sql silverlight-4.0

我一直在Silverlight应用程序中使用Linq查询,该应用程序仅返回包含字段Op​​tionARMRunId(identity)的最大值的表的行。在LinqPad中执行时,查询运行正常并返回正确的行。但是,在我的Silverlight应用程序中使用时,应用程序永远不会移动到加载屏幕之外(当状态百分比达到100%时,蓝色圆圈继续绕着广告恶心)并且我在浏览器中收到错误。我已经包含了原始的Linq语句,我在查询中出现的语句,以及下面的错误。

Linq声明(正常工作):

    from OptionARMProjection in OptionARMProjections.Where(row => row.OptionARMRunId == OptionARMProjections.Max(r => r.OptionARMRunId))
select OptionARMProjection

C#类中的Linq语句(运行silverlight应用程序时会导致错误):

    crocodileEntities proxy = new crocodileEntities(new Uri("CrocodileDbDataService.svc", UriKind.Relative));



    var ProjectionsQuery = from OptionARMProjections in proxy.OptionARMProjections.Where(row => row.OptionARMRunId == proxy.OptionARMProjections.Max(r => r.OptionARMRunId))
                            select OptionARMProjections;

在ie8收到错误:

  

网页错误详情

     

用户代理:Mozilla / 4.0(兼容;   MSIE 8.0; Windows NT 6.1;三叉戟/ 4.0;   SLCC2; .NET CLR 2.0.50727; .NET CLR   3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Zune 4.0;   OfficeLiveConnector.1.4;   OfficeLivePatch.1.3; .NET4.0C;   .NET4.0E)时间戳:2010年1月20日星期三   03:06:13 UTC

     

消息:未处理的错误   Silverlight 2应用程序方法   'Max'不受支持。在   System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression   mce)at   System.Data.Services.Client.ExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.ExpressionVisitor.VisitBinary(BinaryExpression   b)在   System.Data.Services.Client.ResourceBinder.VisitBinary(BinaryExpression   b)在   System.Data.Services.Client.ExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.ExpressionVisitor.VisitLambda(LambdaExpression   lambda)   System.Data.Services.Client.ExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.ExpressionVisitor.VisitUnary(UnaryExpression   你在   System.Data.Services.Client.ExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式   exp)at   System.Data.Services.Client.ExpressionVisitor.VisitExpressionList(ReadOnlyCollection 1 original) at System.Data.Services.Client.ExpressionVisitor.VisitMethodCall(MethodCallExpression m) at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce) at System.Data.Services.Client.ExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.DataServiceExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.ResourceBinder.AnalyzeProjection(MethodCallExpression mce, Boolean matchMembers, Expression& e) at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce) at System.Data.Services.Client.ExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.DataServiceExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.ResourceBinder.Bind(Expression e) at System.Data.Services.Client.DataServiceQueryProvider.Translate(Expression e) at System.Data.Services.Client.DataServiceQuery 1.get_QueryComponents()   在   System.Data.Services.Client.DataServiceRequest.CreateResult(对象   source,DataServiceContext上下文,   AsyncCallback回调,对象状态)   在   System.Data.Services.Client.DataServiceQuery`1.BeginExecute(AsyncCallback的   回调,对象状态)at   OptionARMChart.OptionARMUniverse.GetOptionArmProjectionsASync()   在OptionARMChart.MainPage..ctor()
  在   OptionARMChart.App.Application_Startup(对象   sender,StartupEventArgs e)at   MS.Internal.CoreInvokeHandler.InvokeEventHandler(的Int32   typeIndex,委托handlerDelegate,   对象发送者,对象args)at   MS.Internal.JoltHelper.FireEvent(IntPtr的   unmanagedObj,IntPtr unmanagedObjArgs,   Int32 argsTypeIndex,String eventName)   行:1个字符:1代码:0 URI:   http://localhost:5004/optionarmcharttestpage.aspx

2 个答案:

答案 0 :(得分:3)

.Max()不受支持,解决方法是执行相反的顺序并采取第一个:

var ProjectionsQuery = proxy.OptionARMProjections
                       .Where(row => row.OptionARMRunId == proxy.OptionARMProjections
                       .OrderByDescending(r => r.OptionARMRunId))
                       .Take(1);

更正:Seems it is supported in Silverlight 3+,但它不止一次给我同样的麻烦,所以也许有人可以添加一些更详细的原因。

答案 1 :(得分:1)

Data Services使用的URI语法不支持LINQ to Objects或LINQ to SQL支持的所有函数。我假设当你在LINQPad中查询它时,你正在进行LINQ to SQL查询,这就是为什么它可以在那里工作。但是,Data Services不支持查询的复杂性,这解释了本例中的运行时异常。

根据您的查询判断,您应该能够使用Nick提出的解决方案,但我认为他提供的Where子句中存在错误。事实上,从您的原始样本中,您甚至不需要Where子句:

var ProjectionsQuery = proxy.OptionARMProjections    .OrderByDescending(row => row.OptionARMRunId)    。取(1);