Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197

    [c#]filtrare collezione con nome campo dinamico

    ho una List<MyClass> e dovrei filtrarla passando il nome del campo, l'operatore e il valore da cercare come stringa
    dovrei fare una specie di linq dinamica o qualcosa di simile

    una cosa del genere ma presupponendo di non conoscere a priori il nome del campo

    mialista.Find(x => x.??? == "6") ovviamente rendendo dimanico sia il nome campo sia l'operatore

    qualche suggerimento?

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Si fa con gli alberi di espressione, questo è il caso specifico del tuo esempio ma si puo creare qualsiasi tipo di query anche piu complessa:

    codice:
    public class Searcher<TModel, TField>
        {
            public static IQueryable<TModel> Search(IQueryable<TModel> dbSet, string campo, TField valore)
            {
                ParameterExpression pe = Expression.Parameter(typeof(TModel), "entity");
    
                Expression left = Expression.Property(pe, typeof(TModel).GetProperty(campo));
                Expression right = Expression.Constant(valore, typeof(TField));
                Expression e2 = Expression.Equal(left, right);
    
                MethodCallExpression whereCallExpression = Expression.Call(
                    typeof(Queryable),
                    "Where",
                    new Type[] { dbSet.ElementType },
                    dbSet.Expression,
                    Expression.Lambda<Func<TModel, bool>>(e2, new ParameterExpression[] { pe }));
    
                IQueryable<TModel> results = dbSet.Provider.CreateQuery<TModel>(whereCallExpression);
    
                return results;
            }
        }
    Se vuoi capirla per bene e sfruttarla a pieno devi studiarti gli Expression Tree.

    lo usi cosi:

    codice:
    var trentacinquenni = Searcher.Search<Persona, int>(elenco.AsQueryable(), "Eta", 35);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.