UpdateСоздание запроса LINQ с помощью деревьев выражений
Благодаря помощи Марка, класс AlphaPagedList is now available on CodePlex если кто-то заинтересован
Оригинал
Я пытаюсь создать дерево выражения для возвращаемые элементы, начинающиеся с заданного charecter.
IList<char> chars = new List<char>{'a','b'};
IQueryable<Dept>Depts.Where(x=> chars.Contains(x.DeptName[0]));
Я хочу, чтобы это использовать на любом IEnumerable, где я обеспечиваю lamdba свойству, чтобы выбрать из, например:
Depts.Alpha(x=>x.DeptName, chars);
Я пытался это, но не имея никакой удачи на всех , любая помощь?
public static IQueryable<T> testing<T>(this IQueryable<T> queryableData, Expression<Func<T,string>> pi, IEnumerable<char> chars)
{
// Compose the expression tree that represents the parameter to the predicate.
ParameterExpression pe = Expression.Parameter(queryableData.ElementType, "x");
ConstantExpression ch = Expression.Constant(chars,typeof(IEnumerable<char>));
// ***** Where(x=>chars.Contains(x.pi[0])) *****
// pi is a string property
//Get the string property
Expression first = Expression.Constant(0);
//Get the first character of the string
Expression firstchar = Expression.ArrayIndex(pi.Body, first);
//Call "Contains" on chars with argument being right
Expression e = Expression.Call(ch, typeof(IEnumerable<char>).GetMethod("Contains", new Type[] { typeof(char) }),firstchar);
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<T, bool>>(e, new ParameterExpression[] { pe }));
// ***** End Where *****
return (queryableData.Provider.CreateQuery<T>(whereCallExpression));
}
Отлично, большое спасибо за это. Я работаю над алфавитно-цифровым списком подкачки (по типу IPagedList), и это будет бесценно. – Chao