Linq эквивалент SQL функции LEFT? - PullRequest
4 голосов
/ 08 мая 2011

У нас есть база данных с полями varchar (max), которые могут содержать много текста, однако у меня есть ситуация, когда я хочу выбрать только первые, например, 300 символов из поля для разбитой на страницы таблицы результатов в Веб-сайт MVC для «предварительного просмотра» поля.

для упрощенного примера запроса, в котором я хочу получить все местоположения для отображения в таблице (это будет разбито на страницы, поэтому я не просто получаю все - я получаю, может быть, 10 результатов за раз):

return db.locations;

Однако это дает мне объект местоположения со всеми полями, содержащими огромные объемы текста, выполнение которого занимает очень много времени.

Так что я раньше использовал хранимые процедуры SQL с:

LEFT(field, 300) 

для решения этой проблемы, а затем в .dbml-файле Linq to SQL была включена хранимая процедура для возврата объекта «location» для результата.

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

Возможно, это простое решение, но я не уверен, как я могу сформулировать это в поисковой системе, я был бы признателен всем, кто может помочь мне с этой проблемой.

Ответы [ 3 ]

5 голосов
/ 08 мая 2011

Вы также можете использовать функции, которые напрямую преобразуются в эти функции, это полезно, когда вам нужно перевести код, который функционально прекрасно работает в SQL, без риска в LINQ. Посмотрите на System.Data.Objects.EntityFunctions

Locations.Select(loc=>System.Data.Objects.EntityFunctions.Left(loc.Field,300))

Это будет напрямую переведено в LEFT на стороне сервера.

3 голосов
/ 08 мая 2011

РЕДАКТИРОВАТЬ: я неправильно прочитал LEFT для LTRIM. Вот все функции String, которые нельзя использовать в LINQ to SQL . Вы пробовали String.Substring()?

Ваш лучший вариант - отобразить хранимую процедуру и продолжить ее использование. Вот отличная статья со снимками экрана , показывающая, как это сделать.

Если вы не используете инструмент конструктора , вы также можете вызвать ExecuteCommand для DataContext . Это не красиво, но это то, что мы имеем на данный момент.

2 голосов
/ 10 мая 2011

Я обнаружил, что что-то вроде этого работает для меня:

return from locationPart in db.locations
       select new LocationPart
       {                       
         Description = locationPart.description,
         Text = locationPart.text.Substring(0,300)                       
       };

Не идеально, потому что я должен использовать «выбрать новый», чтобы вернуть другой объект, но, похоже, он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...