Question

J'ai la requête Linq to SQL suivante, dans laquelle j'essaie de créer une multi-colonne 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;

Cela lève InvalidOperationException (& "; impossible de classer par type" Tâche ". &";)).

.

Existe-t-il une interface que Task doit implémenter ( déjà implémente IComparable, IComparable < ITask >)? Est-ce que Task doit être une entité Linq to SQL (ce n'est pas le cas actuellement, car il n'y a pas de table correspondante). Ou est-ce juste quelque chose que Linq to SQL ne supporte pas?

Notez que j'ai déjà essayé un type anonyme pour le regroupement, qui a échoué avec une exception InvalidOperationException similaire:

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

Pour ce qui en vaut la peine, notez que l’objet Task est un composite de 2 champs; l'un est un caractère unique (typiquement 'S' ou 'B') et l'autre est un int (en fait une base de données croisée & «clé étrangère &» si vous le souhaitez). Le fait de classer par les tâches ne fait que comparer leurs représentations sous forme de chaîne; PAR EXEMPLE. Tâche 'B101' & Lt; Tâche 'S999'

Était-ce utile?

La solution

On dirait que vous avez déjà votre solution, mais seulement FYI LINQ to SQL prend en charge .ToUpper().

Par exemple:

NorthwindDataContext dc = new NorthwindDataContext();
Product product = dc.Products.Single(p => p.ProductName.ToUpper() == "CHAI");

est traduit en:

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'

L’espoir que cela aide.

Autres conseils

OK, j'ai compris cela. J'ai eu deux problèmes; Tout d'abord, ToUpper () ne se traduit pas en SQL, et deuxièmement, je ne pense pas que Linq to SQL prenne en charge orderby sur des objets; du moins pas des non-entités. En décomposant la commande en ses colonnes, tout a commencé à fonctionner comme prévu.

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

Je pense que vous avez besoin d'une sélection avant votre groupe avant - vous voulez convertir les objets en tâches, puis les commander par quelque chose d'autre (Task.start ou quelque chose)

Linq to SQL peut prendre en charge String.ToUpper (), mais il ne prend pas en charge Char.ToUpper (), ce dont j'avais besoin pour cette table et cette colonne en particulier. Mais merci pour l'info quand même!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top