Génération d'une requête LINQ à l'aide d'arbres d'expression

c# expression-trees lambda linq

Question

Mettre à jour

Grâce à l'aide de Marc, la classe AlphaPagedList est maintenant disponible sur CodePlex si cela vous intéresse.

Original

J'essaie de créer un arbre d'expression pour renvoyer des éléments qui commencent par un caractère donné.

IList<char> chars = new List<char>{'a','b'};
IQueryable<Dept>Depts.Where(x=> chars.Contains(x.DeptName[0]));

Je veux que cela soit utilisé sur n'importe quel IEnumerable où je fournis un lamdba à la propriété pour sélectionner par exemple:

Depts.Alpha(x=>x.DeptName, chars);

J'ai essayé cela mais sans aucune chance, aucune aide?

IList<char> chars = new List<char>{'a','b'};
IQueryable<Dept>Depts.Where(x=> chars.Contains(x.DeptName[0]));

Réponse acceptée

Quelque chose comme (Edited après avoir relu la question) - mais notez que Expression.Invoke ne fonctionne pas sur EF dans 3.5SP1 (mais il est très bien dans LINQ to SQL):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

class Dept
{
    public string DeptName { get; set; }
}
public static class Program
{
    static void Main()
    {
        IList<char> chars = new List<char>{'a','b'};
        Dept[] depts = new[] { new Dept { DeptName = "alpha" }, new Dept { DeptName = "beta" }, new Dept { DeptName = "omega" } };
        var count = testing(depts.AsQueryable(), dept => dept.DeptName, chars).Count();
    }

    public static IQueryable<T> testing<T>(this IQueryable<T> queryableData, Expression<Func<T,string>> pi, IEnumerable<char> chars)
    {
        var arg = Expression.Parameter(typeof(T), "x");
        var prop = Expression.Invoke(pi, arg);
        Expression body = null;
        foreach(char c in chars) {
            Expression thisFilter = Expression.Call(prop, "StartsWith", null, Expression.Constant(c.ToString()));
            body = body == null ? thisFilter : Expression.OrElse(body, thisFilter);
        }
        var lambda = Expression.Lambda<Func<T, bool>>(body ?? Expression.Constant(false), arg);
        return queryableData.Where(lambda);
    }
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi