1

我有以下 Linq to SQL 查询,其中我正在尝试执行多列 GROUP BY:

return from revision in dataContext.Revisions
       where revision.BranchID == sourceBranch.BranchID-1
                && !revision.HasBeenMerged
       group revision by new Task(revision.TaskSourceCode.ToUpper(), 
                                  revision.TaskSourceID)
       into grouping
       orderby grouping.Key ascending
       select (ITask)grouping.Key;

这将引发 InvalidOperationException(“无法按类型“任务”排序。”)。

是否有 Task 必须实现的接口(它已经实现了 IComparable、IComparable<ITask>)?Task 是否需要是 Linq to SQL 实体(目前不需要,因为没有对应的表)。或者这只是 Linq to SQL 不支持的东西?

请注意,我已经为分组尝试了匿名类型,但失败并出现类似的 InvalidOperationException:

...
group revision by new { Code = revision.TaskSourceCode.ToUpper(),
                        Id = revision.TaskSourceID } 
...

值得一提的是,Task 对象是 2 个字段的组合;一个是单个字符(通常是“S”或“B”),另一个是 int(如果您愿意,实际上是跨数据库的“外键”)。Tasks 的排序行为只是比较它们的字符串表示;EG 任务“B101”< 任务“S999”

4

4 回答 4

2

好的,我想通了。我有两个问题;首先,ToUpper() 不翻译成 SQL,其次,我不认为 Linq to SQL 支持对象的 orderby;至少不是非实体。通过将 orderby 分解为其组成列,一切都开始按计划进行。

return from revision in dataContext.Revisions
       where revision.BranchID == sourceBranch.BranchID-1
                && !revision.HasBeenMerged
       group revision by new { revision.TaskSourceCode, 
                                  revision.TaskSourceID }
       into grouping
       orderby grouping.Key.TaskSourceCode, 
               grouping.Key.TaskSourceID ascending
       select (ITask)new Task(grouping.Key.TaskSourceCode, 
                              grouping.Key.TaskSourceID);
于 2008-11-27T01:07:27.233 回答
1

看起来您已经有了解决方案,但仅供参考 LINQ to SQL 确实支持.ToUpper().

例如:

NorthwindDataContext dc = new NorthwindDataContext();
Product product = dc.Products.Single(p => p.ProductName.ToUpper() == "CHAI");

被翻译成:

exec sp_executesql N'SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
FROM [dbo].[Products] AS [t0]
WHERE <b>UPPER([t0].[ProductName]) = @p0</b>',N'@p0 nvarchar(4)',@p0=N'CHAI'

希望有帮助。

于 2008-11-27T01:50:18.440 回答
0

我认为您需要在分组之前进行选择-您想将对象转换为任务,然后按其他内容排序(Task.start 或其他内容)

于 2008-11-27T00:38:11.567 回答
0

Linq to SQL 可能支持 String.ToUpper(),但它不支持 Char.ToUpper(),这正是我对这个特定表和列所需要的。但无论如何感谢您的信息!

于 2008-11-27T05:05:41.543 回答