В основном вам нужно построить дерево выражений. К счастью, это не очень сложно, используя Expression.Property
. Вы можете либо передать это в Queryable.Where
, либо скомпилировать и передать в Enumerable.Where
. (Очевидно, вам нужно использовать что-то вроде Expression.Equal
также, в зависимости от типа сравнения, которое вы пытаетесь сделать.)
Является ли CompValue
фактическим значением? Что должно быть TypeOfCompare
? 1013 *
Я не уверен, где LINQ to Entities вписывается в это, либо ... вы действительно используете LINQ to Objects, насколько я могу видеть.
РЕДАКТИРОВАТЬ: Хорошо, вот образец. Предполагается, что вы хотите равенства, но если да, то делает то, что вы хотите. Я не знаю, как влияет на производительность компиляция дерева выражений каждый раз - вы можете кэшировать делегат для любой заданной комбинации имя / значение:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
static class Extensions
{
public static List<T> Filter<T>
(this List<T> source, string columnName,
string compValue)
{
ParameterExpression parameter = Expression.Parameter(typeof(T), "x");
Expression property = Expression.Property(parameter, columnName);
Expression constant = Expression.Constant(compValue);
Expression equality = Expression.Equal(property, constant);
Expression<Func<T, bool>> predicate =
Expression.Lambda<Func<T, bool>>(equality, parameter);
Func<T, bool> compiled = predicate.Compile();
return source.Where(compiled).ToList();
}
}
class Test
{
static void Main()
{
var people = new[] {
new { FirstName = "John", LastName = "Smith" },
new { FirstName = "John", LastName = "Noakes" },
new { FirstName = "Linda", LastName = "Smith" },
new { FirstName = "Richard", LastName = "Smith" },
new { FirstName = "Richard", LastName = "Littlejohn" },
}.ToList();
foreach (var person in people.Filter("LastName", "Smith"))
{
Console.WriteLine(person);
}
}
}