我一直在Silverlight应用程序中使用Linq查询,该应用程序仅返回包含字段OptionARMRunId(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
答案 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);