Generieren einer LINQ-Abfrage mithilfe von Ausdrucksbaumstrukturen

c# expression-trees lambda linq

Frage

Aktualisieren

Dank der Hilfe von Marc ist die AlphaPagedList-Klasse jetzt auf CodePlex verfügbar, falls jemand daran interessiert ist

Original

Ich versuche, einen Ausdrucksbaum zu erstellen, der Elemente zurückgibt, die mit einem bestimmten Zeichen beginnen.

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

Ich möchte, dass dies auf jedem IEnumerable verwendet wird, wo ich der Eigenschaft ein lamdba zur Auswahl z.

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

Ich habe das versucht, aber kein Glück, keine Hilfe?

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

Akzeptierte Antwort

So etwas wie ( BEARBEITEN nach erneutem Lesen der Frage) - Beachten Sie jedoch, dass Expression.Invoke nicht mit EF in 3.5SP1 funktioniert (aber in LINQ-to-SQL ist das in Ordnung):

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);
    }
}



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum