0

我正在编写一个时间表应用程序(Silverlight),我完全坚持让 linq 查询正常工作。我对 linq 很熟悉,我刚刚阅读了 Linq 书中的许多示例,包括 Linq to Objects、linq to SQl 和 linq to Entities。(我假设,但不能 100% 确定后者就是 Lightswitch用途)。我计划研究更多的 Linq,但只需要让这个查询工作。

所以我有一个名为 Items 的实体,它列出了工作中的每个项目,它是序列号

所以:Job.ID int、ID int、SerialNolong

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

所以 Job.ID int, ShiftDate date, Shift int, StartNolong, EndNolong

当用户从自动完成框中选择作业时,我想在时间表实体中查找该作业的 MAX(SerialNo)。如果为空(即没有生产),我想从 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);

谁能指出我正确的方向?

谢谢

标记

4

1 回答 1

1

IDataServiceQueryableIEnumerable不支持像has那样的全套 LINQ 运算符。

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

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

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

var minStartNo = 
            (
                 from ts in this.DataWorkspace.SQLData.Timesheets 
                 where ts.Job.ID == this.TimesheetProperty.Job.ID
                 orderby ts.StartNo descending select ts
            ).FirstOrDefault(); 
于 2014-03-31T07:57:51.980 回答