我有以下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'
答案 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(),这是我需要的特定表和列。但无论如何,谢谢你的信息!