У меня есть следующий запрос 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 <ITask>)? Должна ли задача быть объектом 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»





Я думаю, вам нужен выбор перед вашей группой - вы хотите преобразовать объекты в задачи, а затем заказать что-то еще (Task.start или что-то в этом роде)
Хорошо, я понял это. У меня было две проблемы; во-первых, 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);
Похоже, у вас уже есть решение, но только 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'
Надеюсь, это поможет.
Linq to SQL может поддерживать String.ToUpper (), но не поддерживает Char.ToUpper (), что мне понадобится для этой конкретной таблицы и столбца. Но все равно спасибо за информацию!
Вы можете объяснить, что предлагаете в коде / псевдокоде? Я просто не понимаю, к чему вы клоните ...