2008-11-27 94 views
1

我有以下的LINQ to SQL查询,其中我试图做一个多列GROUP 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.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 } 
... 

对于它的价值,注意,任务目标是2场的复合物;一个是单个字符(通常是'S'或'B'),另一个是int(如果你喜欢,实际上是一个跨数据库的“外键”)。任务排序的行为只是比较他们的字符串表示;例如。任务“B101” <任务“S999”

回答

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' 

希望有所帮助。

0

我想你你的组之前,需要选择的 - 你想对象转换为任务,然后由其他的东西(Task.start或东西)

+0

你能解释一下你在代码/伪代码中的建议吗?我只是没有遵循你所得到的... – 2008-11-27 00:53:40

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); 
0

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