Linq to SQL: Как я могу заказать по составному объекту?

StackOverflow https://stackoverflow.com/questions/322614

  •  11-07-2019
  •  | 
  •  

Вопрос

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

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

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

Обратите внимание, что объект Task состоит из двух полей; один представляет собой один символ (обычно 'S' или 'B'), а другой - целое число (на самом деле кросс-база данных " внешний ключ " если хотите). Акт упорядочения по задачам просто сравнивает их строковые представления; НАПРИМЕР. Задача 'B101' & Lt; Задача 'S999'

Это было полезно?

Решение

Похоже, у вас уже есть решение, но только 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'

Надеюсь, это поможет.

Другие советы

Хорошо, я понял это. У меня были две проблемы; во-первых, 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);

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top