Каков наилучший способ создания настраиваемой сортировки (для данных типа «07/2010») в EF 4.0? - PullRequest
0 голосов
/ 13 октября 2010

У меня есть таблица, которая содержит данные годовой последовательности в столбце, такие как «1/2010», «2/2010» или «13/2010».Я хочу упорядочить данные из этой таблицы по этому столбцу.Поэтому я должен создать значение порядка для сортировки следующим образом:

-- This code should work if amount of data is less than 1000 record per year.
CAST(SUBSTRING(ReceiveID, 0, CHARINDEX('/', ReceiveID)) AS INT) + 1000 * CAST(SUBSTRING(ReceiveID, CHARINDEX('/', ReceiveID) + 1, 4) AS INT)  AS OrderReceiveID

Однако я хочу написать этот код с EF 4.0, но у меня возникло несколько проблем.

СначалаЯ пытаюсь создать выражение заказа в запросе LINQ.Но я не могу вызвать функцию преобразования строки в целочисленное значение, например «int.Parse», потому что она не может преобразовать это в оператор SQL.

Во-вторых, я создаю функцию скалярного значения в базе данных для преобразования строки данных годовой последовательности в целочисленное значение«1/2010» - 20100001. Но я не могу импортировать его в файл edmx, потому что он поддерживает только хранимую процедуру.

Наконец, я создаю настраиваемое представление для этой таблицы, включая столбец настраиваемого порядка (для данных, таких как 2010001) иЯ использую дополнительный столбец, чтобы заказать эту таблицу.Все работает хорошоНо мне это не нравится, потому что мне не нужно создавать одно представление для каждой таблицы.

Есть ли у вас какие-либо идеи для решения этой проблемы без прикосновения к базе данных или создания общей функции для преобразования данных последовательности в целочисленное значение?как моя вторая идея?

Спасибо,

1 Ответ

0 голосов
/ 13 октября 2010

Вы можете попробовать использовать метод ExecuteStoreQuery .
В этом случае вы сможете использовать упомянутый метод для сортировки (и выполнить любой другой собственный SQL).
Код будет выглядеть так:


  var q = context.ExecuteStoreQuery("SELECT ReceiveID, SomeField, SomeOtherField, ...  from Model1.MyEntity order by CAST(SUBSTRING(ReceiveID, 0, CHARINDEX('/', ReceiveID)) AS INT) + 1000 * CAST(SUBSTRING(ReceiveID, CHARINDEX('/', ReceiveID) + 1, 4) AS INT)");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...