Linq to SQL: Как я могу заказать по составному объекту? - PullRequest
1 голос
/ 27 ноября 2008

У меня есть следующий запрос 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 (он уже реализует IComparable, IComparable )? Нужно ли, чтобы Task являлся объектом Linq to SQL (в настоящее время это не так, поскольку нет соответствующей таблицы). Или это только то, что Linq to SQL не поддерживает?

Обратите внимание, что я уже попробовал анонимный тип для группировки, который потерпел неудачу с похожим InvalidOperationException:

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

Для чего стоит, обратите внимание, что объект Task представляет собой смесь из 2 полей; один - это один символ (обычно «S» или «B»), а другой - «int» (на самом деле «внешний ключ» между базами данных, если хотите). Акт упорядочения по задачам просто сравнивает их строковые представления; НАПРИМЕР. Задача 'B101' <Задача 'S999' </p>

Ответы [ 4 ]

2 голосов
/ 27 ноября 2008

ОК, я понял это. У меня были две проблемы; во-первых, ToUpper () не переводится в SQL, а во-вторых, я не думаю, что Linq to SQL поддерживает 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 голос
/ 27 ноября 2008

Похоже, у вас уже есть решение, но только 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 голосов
/ 27 ноября 2008

Linq to SQL может поддерживать String.ToUpper (), но он не поддерживает Char.ToUpper (), который мне нужен для этой конкретной таблицы и столбца. Но все равно спасибо за информацию!

0 голосов
/ 27 ноября 2008

Я думаю, что вам нужно выбрать перед вашей группой - вы хотите преобразовать объекты в задачи, а затем упорядочить что-то еще (Task.start или что-то)

...