Динамичный, где для списка <T>

Короткий ответ:

`dirname $0`

или (предпочтительно):

$(dirname "$0")

6
задан Andrew Hare 7 August 2009 в 19:36
поделиться

3 ответа

В основном вам нужно построить дерево выражений. К счастью, использовать Expression.Property не так уж сложно. Вы можете либо передать его в Queryable.Where , либо скомпилировать и передать в Enumerable.Where . (Очевидно, вам нужно будет использовать что-то вроде Expression.Equal , в зависимости от типа сравнения, которое вы пытаетесь провести.)

Is CompValue предназначено для фактическое значение? Что TypeOfCompare должно быть?

Я не уверен, где 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);
        }
    }
}
13
ответ дан 8 December 2019 в 18:39
поделиться

Вместо строки ColumnName , не могли бы вы передать селектор для этого столбца (я понимаю, что это не всегда возможно, но на всякий случай…)? Тогда вы можете это использовать.

Между прочим, код слишком сложен. Это должно работать:

public static List<T> Filter<T>(
    this List<T> Source, Func<T, string> selector, string CompValue)
{
    return Source.Where(a => selector(a) == CompValue).ToList();
}

Затем вы можете вызвать код следующим образом:

var result = myList.Filter(x => x.ColumnName, "foo");
0
ответ дан 8 December 2019 в 18:39
поделиться

Вы ищете что-то вроде этого: http://naspinski.net/post/Writing-Dynamic-Linq-Queries-in-Linq-to-Entities.aspx В противном случае вам придется обрабатывать каждый случай отдельно, как показано ниже:

if (columnName == "blah")
  matches = matches.Where(i => i.Blah == Value);
if (columnName == "name")
  matches = matches.Where(i => i.Name == Value);
0
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: