2008-11-27 92 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(),這是我需要的特定表和列。但是,無論如何感謝信息!