2014-09-12 4 views
1

Я задал вопрос на Use a NaturalSortComparer in a LINQ Where Clause, и теперь у меня более сложная версия.Dynamic LINQ Where Clause as string с использованием NaturalComparer

Этот запрос предполагается простой запрос, как ProductCode> «U5» и используя NaturalComparer в ИНЕКЕ:

var comparer = new NaturalComparer(); 
Table1.AsEnumerable().Where(t=> 
    comparer.Compare(t.ProductString, "U5") >= 0); 

код ниже для простого известного примера, но на самом деле фильтр вложен и имеет комбинации операндов AND/OR и неизвестно до выполнения. Я хочу перейти в динамический запрос LINQ как строку: данные находятся на SQL Server db, используя LINQ to Entities.

Пример:

var queryString= "((ProductCode > 'U5' Or TagString LIKE '%k') and Date < Now) 
Or (MessageString = 'text' And Date < yesterday) OR SomeOtherString = '100' 
or PriorityString <= '100X' or SomeInt =15"; 

    // Call the constructor with the specified query and the ObjectContext. 
    ObjectQuery<Product> productQuery = 
     new ObjectQuery<Product>(queryString, context); 

Как бы обрабатывать строковые поля с помощью NaturalComparer, и любой другой тип поля должны быть обработаны в обычном режиме?

+0

Для чего это стоит, я дал ответ на ваш прежний вопрос (после того, как был принят другой ответ), который на самом деле предлагает более обобщенное решение, которое вы ищете, не прибегая к Dynamic LINQ, или тянуть всю таблицу в EF для запроса: http://stackoverflow.com/a/25800360/956150 – jdmcnair

ответ

-1

Динамический Линк - просто зло, и его следует избегать.

Что вы действительно хотите использовать здесь: Predicate Builder Joe Albahari, который позволит вам построить предложение where на лету (как в Dynamic linq), но используя свойства безопасного типа обычного LINQ.

+0

Привет, Джеймс. Причина, по которой я хочу передать строку, заключается в том, что я использую Dev Express FilterControl (https: //documentation.devexpress. ком/# WindowsForms/clsDevExpressXtraEditorsFilterControltopic). Этот элемент управления дает мне предложение where как строку. –

1

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

+0

Вот чего я боялся –

Смежные вопросы