2017-01-02 3 views
3

Фон: У меня огромная таблица с множеством столбцов и множеством записей в db. У меня есть некоторые запрограммированные запросы, которые возвращают данные, но мне нужно дать возможность пользователю уточнить запрос (добавить дополнительные фильтры).Linq-to-sql пользовательский предикат

Так что мой вопрос, у меня есть код следующим образом:

var dbquery = (from a in db.test where id > 100 select a); 

Это возвращает IQueryable. Теперь я могу futher фильтровать (и до сих пор запустить запрос на дб), когда я это сделать

var dbquery2 = dbquery.Where(b => b.quanity > 20); 

Но то, что я действительно хочу, чтобы пользователь, чтобы иметь возможность вводить фильтры и он по-прежнему работать на дБ. Я смотрю на PropertyDescriptors, но они всегда говорят, что нет никакого перевода linq на sql-перевод. Как я могу сделать что-то вроде этого:

var dbqueryuser = dbquery.where(c => c.(user specified field) > 20); 

мне нужно сделать пользовательские сгенерированные операторы SQL или можно каким-то образом генерировать действительный

Expression<Func<test,bool>> 

заявления с помощью отражения ли?

Примечание: Это здание на предыдущий вопрос, я спросил здесь Linq to custom sql

Я поясню нужно взять список фильтров, но и получать запросы для работы на БД (как БД возвращает много данных, и я хочу чтобы получить как можно больше фильтруется на стороне БД, а не стороне пользователя)

+0

Да, вы можете создать 'Expression > 'dynami но не с отражением, а с методами класса Expression. Существует много примеров того, как это сделать, если вы хотите получить более конкретный ответ, вы должны опубликовать, как выглядит ваше определение фильтра. –

ответ

1

вы должны генерировать пользовательские Expression, просто для примера (он не компилируется):

var param = Expression.Parameter(typeof(Entity)); 
var property = Expression.PropertyOrField(param, propertyName); 
var greater = Expression.GreaterThan(property, Expression.Constant(20)); 
var lambda = (Expression<Func<Entity, bool>>)Expression.Lambda(greater, param); 
+0

Works :) thanks Как я могу это сделать по свойствам, которые могут быть обнуляемы? В нем говорится, что нет большего оператора, который может сравнивать Nullable с System.Int32 – lesyriad

+0

Они не сопоставимы, вы должны получить свойство Value от nullable или, лучше, вызывать метод getValueOrDefault или читать, например, hier: http://stackoverflow.com/questions/586097/compare-nullable-types-in-linq-to-sql есть много вещей о выражениях на SO –

+0

. Посмотрите на это :) спасибо, но я нашел другое решение var testnull = Expression.TypeAs (Expression.Constant (20), typeof (Nullable )); var more = Expression.GreaterThan (свойство, testnull); – lesyriad