1

次の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 (「タイプ 'Task' で注文できません。」) がスローされます。

Task が実装する必要があるインターフェイスはありますか (既に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 つのフィールドの複合体であることに注意してください。1 つは単一の文字 (通常は 'S' または 'B') で、もう 1 つは int (実際にはデータベース間の「外部キー」) です。タスクによる順序付けの行為は、それらの文字列表現を比較するだけです。EG タスク 'B101' < タスク 'S999'

4

4 に答える 4

2

OK、私はこれを理解しました。私には 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);
于 2008-11-27T01:07:27.233 に答える
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'

それが役立つことを願っています。

于 2008-11-27T01:50:18.440 に答える
0

グループ化する前に選択が必要だと思います-オブジェクトをタスクに変換してから、別のもの(Task.startなど)で並べ替えたい

于 2008-11-27T00:38:11.567 に答える
0

Linq to SQL は String.ToUpper() をサポートしている可能性がありますが、この特定のテーブルと列に必要な Char.ToUpper() はサポートしていません。でもとにかく情報ありがとう!

于 2008-11-27T05:05:41.543 に答える