2010-10-13 28 views
6

Tôi có một phương pháp mở rộng LINQ để tự động lọc LINQ truy vấn bằng cách sử dụng các giá trị chuỗi. Ví dụ: query.WhereHelper("columName", ">", 1). Tôi có thể sử dụng nhiều toán tử lọc khác nhau như GreaterThan hoặc NotEqual, v.v. nhưng không phải là "Thích". Không có Expression.Like hoặc Expression.StartsWith vv Làm thế nào tôi có thể thực hiện giống như nhà điều hành cây Expression của tôi? Dưới đây là mã của tôi:Giống như toán tử trong Expression Tree

public static IQueryable<T> WhereHelper<T>(this IQueryable<T> source, string columnName, object value, string filterType) 
{ 
    ParameterExpression table = Expression.Parameter(typeof(T), ""); 
    Expression column = Expression.PropertyOrField(table, columnName); 
    Expression valueExpression = Expression.Convert(Expression.Constant(value), column.Type); 
    Expression where = null; 

    switch (filterType) 
    { 
     case "<": 
      where = Expression.LessThan(column, valueExpression); 
      break; 
     case "<=": 
      where = Expression.LessThanOrEqual(column, valueExpression); 
      break; 
     case "=": 
      where = Expression.Equal(column, valueExpression); 
      break; 
     case ">": 
      where = Expression.GreaterThan(column, valueExpression; 
      break; 
     case ">=": 
      where = Expression.GreaterThanOrEqual(column, valueExpression); 
      break; 
     case "<>": 
      where = Expression.NotEqual(column, valueExpression); 
      break; 
    } 

    Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table }); 

    Type[] exprArgTypes = { source.ElementType }; 

    MethodCallExpression methodCall = Expression.Call(typeof(Queryable), 
                 "Where", 
                 exprArgTypes, 
                 source.Expression, 
                 lambda); 

    return (IQueryable<T>)source.Provider.CreateQuery<T>(methodCall); 

Trả lời

7

Bạn sẽ sử dụng Expression.Call với string.StartsWith, string.Contains, string.EndsWith vv phương pháp. Đó là cho mã tiêu thụ để dịch nó trở lại TSQL. Lưu ý rằng đối với LINQ-to-SQL cũng có một số hàm trợ giúp bổ sung ở đây, nhưng không phải với EF.

+1

Các "chức năng helper" Ý tôi là là [ 'SqlMethods'] (http://msdn.microsoft.com/en-us/library/system. data.linq.sqlclient.sqlmethods.aspx) - cụ thể là 'Like()' –

+1

Nhận xét về EF không chính xác. Có [EntityFunctions] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx) mà là analagous để 'SqlMethods' cho L2S. Tuy nhiên, các chức năng như 'EndsWith' và' Contains' được hỗ trợ nguyên bản trong EF và không yêu cầu những người trợ giúp như vậy. –

+0

@Xin ơn cảm ơn; Tôi không biết về điều đó. –

6

Bạn có thể xác NHƯ biểu như sau,

var propertyName = "Firstname"; 
var propertyValue= "xxxx"; 

MethodInfo refmethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
var parameter = Expression.Parameter(typeof(T), "type"); 
var property = Expression.Property(parameter, propertyName); 
var value = Expression.Constant(propertyValue, typeof(string)); 
var containsMethodExp = Expression.Call(property, refmethod, value); 
+0

Đã kiểm tra và hoạt động đúng cách Bạn đã lưu ngày của tôi! Cảm ơn bạn! – GiveEmTheBoot

Các vấn đề liên quan