118 messaggi dal 09 luglio 2007
Salve, stavo provando ad apprendere l'espressioni ad albero,creando una query dinamica con quest'ultimo.

questo è il codice:
  public enum Compare
    {
        Or = ExpressionType.Or,
        And = ExpressionType.And,
        Xor = ExpressionType.ExclusiveOr,
        Not = ExpressionType.Not,
        Equal = ExpressionType.Equal,
        Like = ExpressionType.TypeIs + 1,
        NotEqual = ExpressionType.NotEqual,
        OrElse = ExpressionType.OrElse,
        AndAlso = ExpressionType.AndAlso,
        LessThan = ExpressionType.LessThan,
        GreaterThan = ExpressionType.GreaterThan,
        LessThanOrEqual = ExpressionType.LessThanOrEqual,
        GreaterThanOrEqual = ExpressionType.GreaterThanOrEqual

    }
    public class NorthWindFilter<T> where T : class
    {
      


        public Expression<Func<T, bool>> ExecuteQuery(string fieldname, Compare tipo, object costante)
        {

            var p = Expression.Parameter(typeof(T), typeof(T).Name);
            var order = typeof(T).GetProperty(fieldname);
            var expr = CombineFunc(Expression.PropertyOrField(p, order.Name), tipo, Expression.Constant(costante));
            var predicate = Expression.Lambda<Func<T, bool>>(expr, new ParameterExpression[] { p });
            return predicate;

        }
       
        private static Expression CombineFunc(Expression left, Compare condType, Expression right)
        {

            switch (condType)
            {
                case Compare.Or:
                    return Expression.Or(left, right);
                    break;
                case Compare.And:
                    return Expression.And(left, right);
                    break;
                case Compare.Xor:
                    return Expression.ExclusiveOr(left, right);
                    break;
                case Compare.Equal: 
                    return Expression.Equal(left, right);
                    break;
                case Compare.OrElse:
                    return Expression.OrElse(left, right);
                    break;
                case Compare.AndAlso:
                    return Expression.AndAlso(left, right);
                    break;
                case Compare.NotEqual:
                    return Expression.NotEqual(left, right);
                case Compare.LessThan:
                    return Expression.LessThan(left, right);
                    break;
                case Compare.GreaterThan:
                    return Expression.GreaterThan(left, right);
                    break;
                case Compare.LessThanOrEqual:
                    return Expression.LessThanOrEqual(left, right);
                    break;
                case Compare.GreaterThanOrEqual:
                    return Expression.GreaterThanOrEqual(left, right);
                    break;



                default:
                    throw new ArgumentException("Not a valid Condition Type", "condType", null);
            }

        }


e poi la richiamo nella mia View(sto lavorando in asp.net mvc) in questo modo:

NorthWindFilter<Orders> ordini=new NorthWindFilter<Orders>();
            var result = ordini.ExecuteQuery("ShippedDate", Compare.GreaterThan, "16/07/1996");

            var query = nwdb.Orders.Where(result);
                       
          
            return View(query);

Il problema è che mi dà il seguente errore:
L'operatore binario GreaterThan non è definito per i tipi 'System.Nullable`1[System.DateTime]' e 'System.String'.

Non so il perchè, qualcuno mi potrebbe dare un indizio?
Grazie.
P.S.:Anche perchè l'unico esempio che veramente rispecchiava le mie intenzioni per quanto riguarda le query dinamiche l'ho trovato in Visual Basic.NET, se fosse posssibile in c#.Grazie ancora

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC