【问题标题】:LINQ expression works in LinqPad but not C# Silverlight ApplicationLINQ 表达式在 LinqPad 中有效,但在 C# Silverlight 应用程序中无效
【发布时间】:2011-01-07 02:43:57
【问题描述】:

我一直在 Silverlight 应用程序中使用 Linq 查询,它只返回包含字段 OptionARMRunId(身份)的最大值的表行。在 LinqPad 中执行时,查询运行良好并返回正确的行。然而,当在我的 Silverlight 应用程序中使用时,应用程序永远不会越过加载屏幕(当状态百分比变为 100% 时,蓝色圆圈继续旋转,令人作呕)并且我在浏览器中收到错误消息。我已经包含了原始的 Linq 语句,它出现在我的查询中的语句,以及下面的 ie 错误。

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;视窗 NT 6.1;三叉戟/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729;媒体中心PC 6.0; InfoPath.2;祖尼4.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E) 时间戳:2010 年 1 月 20 日,星期三 03:06:13 UTC

消息:未处理的错误 Silverlight 2 应用 方法 不支持“最大”。在 System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce) 在 System.Data.Services.Client.ExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.ExpressionVisitor.VisitBinary(BinaryExpression b) 在 System.Data.Services.Client.ResourceBinder.VisitBinary(BinaryExpression b) 在 System.Data.Services.Client.ExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.ExpressionVisitor.VisitLambda(LambdaExpression λ) 在 System.Data.Services.Client.ExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.ExpressionVisitor.VisitUnary(UnaryExpression u) 在 System.Data.Services.Client.ExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.DataServiceExpressionVisitor.Visit(表达式 exp)在 System.Data.Services.Client.ExpressionVisitor.VisitExpressionList(ReadOnlyCollection1 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.DataServiceQuery1.get_QueryComponents() 在 System.Data.Services.Client.DataServiceRequest.CreateResult(对象 源,DataServiceContext 上下文, AsyncCallback 回调,对象状态) 在 System.Data.Services.Client.DataServiceQuery`1.BeginExecute(AsyncCallback 回调,对象状态)在 OptionARMChart.OptionARMUniverse.GetOptionArmProjectionsASync() 在 OptionARMChart.MainPage..ctor()
在 OptionARMChart.App.Application_Startup(对象 发件人,StartupEventArgs e) 在 MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex,委托 handlerDelegate, 对象发送者,对象参数)在 MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex,字符串事件名称) 行:1 字符:1 代码:0 URI: http://localhost:5004/optionarmcharttestpage.aspx

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 在 linq 语句中收到一个错误,即运算符 '==' 不能应用于类型为 'int' 和 'System.Linq.IOrderedQueryable
    • 更新:得到它:var ProjectionsQuery = proxy.OptionARMProjections.OrderByDescending(r => r.OptionARMRunId).Take(1);再次感谢您的帮助
    • 很高兴听到 Andrew(刚起床 :) 如果还有其他问题,请再次评论,我会尽力帮助您。
    【解决方案2】:

    数据服务使用的 URI 语法不支持 LINQ to Objects 或 LINQ to SQL 支持的所有函数。我假设当您在 LINQPad 中查询它时,您正在执行 LINQ to SQL 查询,这就是它可以在那里工作的原因。但是,数据服务不支持查询的复杂性,这在这种情况下解释了您的运行时异常。

    从您的查询来看,您应该可以使用 Nick 提出的解决方案,但我认为他提供的 Where 子句中存在错误。实际上,从您的原始示例中,您甚至不需要 Where 子句:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多