Как вызвать Table-Valued как часть команды Linq to Entities - PullRequest
0 голосов
/ 22 ноября 2011

Я хотел бы иметь возможность использовать полнотекстовый поиск в Code First Entity Framework.Однако это не единственная специфичная для SQL функция, которую команда, в которой я буду использовать, вероятно, будет использовать в будущем.

Я знаю, что Code First не предполагается для выполнения специфических для базы данных вещей.или UDF.

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

Так что в идеале я мог бы измениться на летуимя таблицы, которую конкретный DataSet запрашивает dbo.GetMyEntityName(queryString).Я не думаю, что есть способ сделать это, я думал о его замене до того, как он был отправлен на сервер sql, но даже мне удалось узнать, что это за ссылка на таблицу.

Я попытался выяснить, как EFProviderWrappers справляется с этим, но сначала он не очень хорошо обрабатывает код, и у меня сейчас нет свободного времени, чтобы написать новую версию для Code First.Я не знаю, возможно ли вообще заменить какую-либо часть команды, я не смог заставить ее работать вообще.Хотя я не пробовал запускать его с помощью edmx.

Другая вещь, о которой я подумал, - это использование метода IQueryable.ToString, который для моего DbQueries возвращает SQL-обертку с select * from ({0}) where {1}, а затем выполняет его.при использовании Context.Database.SqlQuery проблема с этой структурой сущностей была перепутана между моими ViewModels и объектами моего Домена, потому что в некоторых случаях они имели схожие или одинаковые имена.

Другое решение состояло в том, чтобы зарегистрировать поиск / заменить на пользовательский SqlConnection, поэтому после регистрации следующий выбор будет отредактирован, и что-то вроде [dbo].[MyEntity] будет заменено на [dbo].GetMyEntity('query').Однако это очень ограниченно: если вы хотите ссылаться на одну и ту же таблицу несколько раз в одном и том же запросе, тогда он заменит оба, первое или последнее ... что не очень гибко.Если бы я мог выяснить, как он решает создать псевдоним этих таблиц, этот метод был бы очень прост.

Любые идеи будут с благодарностью.

1 Ответ

1 голос
/ 23 ноября 2011

Серьезно.Идея не в том, чтобы использовать EF в такой ситуации - использовать SQL напрямую, потому что вы знаете имя ваших таблиц (вы определяете отображение).Как вы можете видеть, EF имеет серьезные недостатки в вашем сценарии, поскольку он нацелен на более мелкие (менее производительные) критически важные приложения.

Этот разрыв в незрелости можно исправить после выпуска .NET 4.5, где табличные функции будут поддерживаться напрямую.(но только при использовании EDMX).

...