2014-02-20 3 views
0
Dim Param = Expression.Parameter(source.ElementType) 
Dim columnProperty = Expression.PropertyOrField(Param, Column.Name) 
Dim conversion As Expression = Expression.Convert(columnProperty, GetType(String)) 
Dim likeValue = Expression.Constant(value, GetType(String)) 
Dim ContainMethodExp = Expression.[Call](columnProperty, GetType(String).GetMethod("Contains"), likeValue) 
Dim where = Expression.[Call](GetType(Queryable), "Where", New Type() {source.ElementType}, source.Expression, Expression.Lambda(ContainMethodExp, Param)) 

Этот код работает для строки типа столбцов, но не работает для типа столбца int32, я попытался использовать expression.convert для преобразования int32 в строку, но сбой. Я могу преобразовать выражение члена в тип объекта, но linq для сущностей поддерживает только примитивные типы данных.Linq to Entities Dynamic Where Раздел

Пожалуйста, помогите написать тот же лямбда-выражения для Int 32 типа для динамической фильтрации

ответ

0

Вы выражение дерево эквивалентно:

.Where(x => x.Column.Contains(likeValue")) 

Как бы вы хотели, чтобы сделать Contains/LIKE сравнение с целыми числами? !

Для целых чисел, следует использовать Expression.Equal вместо Contains вызова метода:

Dim Param = Expression.Parameter(source.ElementType) 
Dim columnProperty = Expression.PropertyOrField(Param, Column.Name) 

Dim equalValue = Integer.Parse(value) 

Dim equalValueExpression = Expression.Constant(equalValue, GetType(Integer)) 
Dim equalExpression = Expression.Equal(columnProperty, equalValueExpression) 
Dim where = Expression.[Call](GetType(Queryable), "Where", New Type() {source.ElementType}, source.Expression, Expression.Lambda(equalExpression , Param)) 

Я не проверял, но должно работать.

+0

Это моя ошибка, что я не изменял «Содержит» в «Равно» при публикации вопроса. Это работает, спасибо. – tinku99

+1

Я пытался преобразовать целочисленный тип в тип строки, и я использовал содержащиеся hod для строкового типа. Я попробовал метод equals для типа int, но он не работал. Код, который вы мне дали, все равно ... Спасибо. – tinku99

0

MarcinJuraszek отвечает работает, но я нашел другую ссылку, которая также помогла мне решить эту проблему

Визит How to Type Cast dynamically to string while using Contains in Dynamic LINQ?

Другим решением является использование StringConvert функций SQL, так что вы можете использовать содержит

Dim method As MethodInfo = GetType(String).GetMethod("Contains", New Type() {GetType(String)}) 
    Dim Value As Expression = Expression.Convert(searchFilter, GetType(String)) 
    Dim Param = Expression.Parameter(source.ElementType) 
    Dim columnProperty As Expression = Expression.Property(Param, Column.Name) 
    columnProperty = Expression.Convert(columnProperty, GetType(System.Nullable(Of Double))) 
    Dim stringConvertMethod = GetType(SqlFunctions).GetMethod("StringConvert", New Type() {GetType(System.Nullable(Of Double))}) 
    columnProperty = Expression.[Call](stringConvertMethod, columnProperty) 
    Dim containsMethodExp = Expression.Call(columnProperty, method, Value) 
    Dim likeValue = Expression.Constant(value, GetType(String)) 
    Dim ContainMethodExp = Expression.[Call](columnProperty, GetType(String).GetMethod("Contains"), likeValue) 
    Dim where = Expression.[Call](GetType(Queryable), "Where", New Type() {source.ElementType}, source.Expression, Expression.Lambda(ContainMethodExp, Param))