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

C# Linq to SQL:如何按复合对象排序?,c#,linq-to-sql,sql-order-by,C#,Linq To Sql,Sql Order By,我有以下Linq to SQL查询,其中我尝试通过以下方式进行多列分组: return from revision in dataContext.Revisions where revision.BranchID == sourceBranch.BranchID-1 && !revision.HasBeenMerged group revision by new Task(revision.TaskSourceCode.

我有以下Linq to SQL查询,其中我尝试通过以下方式进行多列分组:

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)?任务是否需要是LINQtoSQL实体(目前不是,因为没有对应的表)。或者这只是LINQtoSQL不支持的东西

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

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

值得注意的是,任务对象是由2个字段组成的;一个是单个字符(通常是“S”或“B”),另一个是int(如果愿意,实际上是跨数据库的“外键”)。按任务排序的行为只是比较它们的字符串表示形式;例如,任务“B101”我想你需要在分组之前进行选择-你想将对象转换为任务,然后按其他东西(Task.start或其他东西)排序。

好的,我已经解决了这个问题。我有两个问题;首先,ToUpper()不转换为SQL,其次,我认为LINQtoSQL不支持对象上的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);

看起来您已经有了解决方案,但仅供参考,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'
exec sp_executesql N'SELECT[t0].[ProductID],[t0].[ProductID],[t0].[SupplierID],[t0].[CategoryID],[t0].[QuantityPerUnit],[t0].[UnitsInStock],[t0].[UnitsOnOrder],[t0].[ReorderLevel],[t0].[t0].[中断]
来自[dbo]。[Products]作为[t0]
其中UPPER([t0].[ProductName])=@p0',N'@p0 nvarchar(4)',@p0=N'CHAI'

希望对您有所帮助。

Linq to SQL可能支持String.ToUpper(),但它不支持Char.ToUpper(),这正是我在这个特定表和列中需要的。不过还是要谢谢你的信息

你能用代码/伪代码解释一下你的建议吗?我只是不明白你的意思。。。