Linq to SQL:我如何按复合对象排序?

时间:2008-11-27 00:28:14

标签: c# linq-to-sql sql-order-by

我有以下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(“不能按类型'任务'排序。”。

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

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

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

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

看起来你已经有了解决方案,但只有FYI 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'

希望有所帮助。

答案 2 :(得分:0)

我认为你需要在你的小组之前选择一个 - 你想要将对象转换为任务,然后按其他方式排序(Task.start或其他东西)

答案 3 :(得分:0)

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