Lightswitch 2013 Linq查询获取最小值

时间:2014-03-30 16:29:10

标签: linq aggregation lightswitch-2013

我正在撰写时间表应用程序(Silverlight),而且我完全坚持让linq查询正常工作。我是linq,我刚读过Linq一书,包括Linq to Objects,linq to SQl和linq to Entities。(我认为,但我不能100%确定后者是Lightswitch使用的是什么)。我打算学习更多的Linq,但只需要让这一个查询工作。

所以我有一个名为Items的实体,它列出了一个作业中的每个项目,并且它没有

所以:Job.ID int,ID int,SerialNo long

我还有一个Timesheets实体,其中包含班次日期,作业号以及开始和结束序列号没有生成

所以Job.ID int,ShiftDate date,Shift int,StartNo long,EndNo long

当用户从自动填充框中选择作业时,我想在时间表实体中查找该作业的MAX(SerialNo)。如果它是null(即没有产生),我想从该作业的Items实体中查找MIN(SerialNo)(即第一个序列是否应该生成)

我意识到我需要第一个或默认值,需要从Items中指定MIN(SerialNo)作为默认值。

我的时间表屏幕使用TimesheetProperty作为其数据源

我尝试以下方法只是为了从Timesheets实体获取MAX(SerialNo):

var maxSerialNo =
            (from ts in this.DataWorkspace.SQLData.Timesheets
             where ts.Job.ID == this.TimesheetProperty.Job.ID
             select ts.StartNo).Min();

但我收到以下错误:

实例参数:无法转换为' Microsoft.LightSwitch.IDataServiceQueryable'到' System.Collections.Generic.IEnumerable

' Microsoft.LightSwitch.IDataServiceQueryable'不包含' Min'的定义和最好的扩展方法重载' System.Linq.Enumerable.Min(System.Collections.Generic.IEnumerable)'有一些无效的论点

我也不知道为什么我不能使用它:

var maxSerialNo = this.DataWorkspace.SQLData.Timesheets.Min(ts => ts.StartNo);

有人能指出我正确的方向吗?

由于

标记

1 个答案:

答案 0 :(得分:1)

IDataServiceQueryable不支持像IEnumerable那样的完整LINQ运算符集。

  

IDataServiceQueryable - 这是一种特定于LightSwitch的类型,它允许一组受限制的“类LINQ”运算符,这些运算符可以远程访问中间层并最终发布到数据库服务器。该接口是LightSwitch查询编程模型的核心。 IDataServiceQueryable有一个执行查询的成员,它返回IEnumerable的结果。 [Reference]

可能的解决方案是,首先执行查询以通过调用IEnumerable获取类型.ToList()的集合,然后您可以针对第一个查询结果调用.Min()。但是,如果您拥有大量数据,这不是一个好主意,因为.ToList()将检索与查询匹配的所有数据并在客户端进行进一步处理,这是低效的。

另一种方法是,仅使用IDataServiceQueryable支持的运算符更改查询,以避免向客户端检索不必要的数据。例如,要获得最低StartNo,您可以尝试使用orderby descending,然后获取第一个数据,而不是使用.Min()运算符:

var minStartNo = 
            (
                 from ts in this.DataWorkspace.SQLData.Timesheets 
                 where ts.Job.ID == this.TimesheetProperty.Job.ID
                 orderby ts.StartNo descending select ts
            ).FirstOrDefault();