2013-11-19 3 views
0

У меня есть класс, который по существу преобразует фильтр сетки в динамическое выражение linq. Сетка содержит простой поиск, который принимает один вход от пользователя, и я хотел бы создать оператор contains, который может использоваться как общий поиск. Тем не менее, я не могу найти способ создания выражения, чтобы я мог использовать десятичный тип и создать запрос sql (например) sql.Linq Expression Decimal Содержит метод

Вещи, которые я пробовал, но безрезультатно.

Объяснение, определяющее как строку, я предполагал, что смогу использовать метод «Содержит» от typeof(string). Однако он не работает b/c, он знает свой десятичный тип, а не строку. Instance property 'Total' is not defined for type 'System.String'

var parm = Expression.Parameter(typeof(string), "param"); 
var exp = Expression.Property(parm, filter.PropertyName); 
return Expression.Call(exp, containsMethod, constant); 

Создание свой собственный метод для десятичной ..Это кажется, что этот менталитет не представляется возможным, потому что не было бы путь для LINQ, чтобы сгенерировать запрос от этого. LINQ может использовать только известные нативные методы, правильно ли это звучит?

Expression callExpr = Expression.Call(
typeof (decimal), "Contains", new[] {member.Type}, constant, param); 

public static bool Contains(this decimal obj, string value) 
{ 
    String _this = obj.ToString(); 
    return _this.Contains(value); 
} 

В конечном счете она должна генерировать следующий SQL

where total like '%43%' 

и общее время в ТипДанных десятичной

Я попробовал несколько других способов, но его не очень хорошо, любая помощь будет очень оценили.

+0

Вы говорите о Lonq-to-Entities или Linq-to-SQL (или другом)? –

+0

Использование Entity Framework 5.0 – afreeland

+0

Я действительно смущен этим вопросом. Вы говорите, что ваш первый запрос завершился неудачно, потому что 'string' не имеет' Total'. Но 'decimal' тоже этого не имеет. Вы пытаетесь вызвать 'decimal.Contains()', что также не имеет большого смысла. – svick

ответ

0

Я не уверен, что вы там делаете, но позвольте мне перевести эти строки для вас:

var parm = Expression.Parameter(typeof(string), "param"); 
var exp = Expression.Property(parm, filter.PropertyName); 
return Expression.Call(exp, containsMethod, constant); 

В переводе с Linq было бы что-то вроде этого:

x => x.Name.Contains("something") // something is the constant and for example Name is coming from filter.PropertyName 

Это утверждение выше воли throw ошибка, так как x является параметром типа string и string не имеет свойства Name.

Ваше второе утверждение также неправильно:

Expression callExpr = Expression.Call(
typeof (decimal), "Contains", new[] {member.Type}, constant, param); 

public static bool Contains(this decimal obj, string value) 
{ 
    String _this = obj.ToString(); 
    return _this.Contains(value); 
} 

В переводе это выглядит следующим образом:

Contains("something", x); // x is param and something is constant 

Мысль «что-то» должно быть типа десятичной, так как содержит, определено с первым параметром десятичное и вторым параметром является строка.

Кстати, если вы ищете строку из десятичной суммы, вы можете использовать Expression.Convert (..).

Есть много примеров Expression.Convert в Интернете, просто спросите Google.

+0

Спасибо за разъяснение в выражении Expression.Property(). – afreeland

+0

Нужны ли вам дальнейшие переводы деревьев выражений? –

+0

Это было очень полезно, увидев выстроенное выражение. Собирался посмотреть вашу рекомендацию Expression.Convert(), чтобы узнать, выгодно ли мне то, что я пытаюсь выполнить. Если у вас есть какие-либо примеры, не стесняйтесь публиковать сообщения в своем ответе. – afreeland