Подтвердить что ты не робот

Динамический LINQ - есть ли версия .NET 4?

Я хочу использовать LINQ для некоторых поисковых процедур и хотел бы иметь некоторые динамические предложения where. Например, если пользователь хочет выполнить поиск по городу или выполнить поиск по состоянию, у меня будет динамический вызов LINQ Where < > вместо создания двух строго типизированных выражений LINQ, а затем с использованием соответствующего метода в зависимости от того, как пользователь хочет выполнить поиск.

Итак, я хотел бы сделать это:

String criteria="p.City='Pittsburgh'";  //or "p.State='PA'"
personData.Where(criteria)

вместо

personData.Where(p => p.City=="Pittsburgh");

или

personData.Where(p => p.State=="PA");

Я наткнулся на сообщение в блоге Скотта Гатри, в котором рассказывается о динамическом LINQ в образцах Visual Studio 2008. Это похоже на то, что я хочу, но мои вопросы:

  • Является ли эта библиотека образцов поддерживаемой Microsoft?
  • Статья Скотта Гатри относится к VS2008 (.NET 3.5). Есть ли лучший вариант для .NET 4? Может быть, что-то, что было выпущено с .NET 4, которое выполняет одно и то же (или что-то очень близкое)?

Спасибо заранее!

4b9b3361

Ответ 1

Эта функция будет очень приятной. Аналогичная функция существует в ADO.net Datatables. Это было бы действительно полезно для LinqToSql. Конечно, вы потеряете строго типизированную проверку, но в этом весь смысл, вы хотите динамический поиск. Если вы правильно справляетесь с исключениями, я действительно думаю, что его ценность стоит иметь.

Возможно, вы захотите добавить запрос функции в Microsoft Connect. Библиотека уже существует, возможно, они рассмотрят возможность добавления официальной поддержки для нее. Если вы сделаете запрос на функцию, убедитесь, что вы разместили ссылку здесь, чтобы мы могли проголосовать за нее. Система Microsoft Connect имеет систему голосования, похожую на stackoverflow. Я представил несколько из них LinqtoSql TableUpdate и VB.net Readonly Интерфейсы, такие как С#.

Я помню, что у меня были проблемы с этой библиотекой. Я думаю, что это как-то связано со статическими методами.

Мне было лучше разработать нужные мне выражения. Эта статья статьи Илья Буйлук демонстрирует пользовательские выражения. Самое приятное, что в Ilya framework он удаляет много кода шаблона при выполнении операций, таких как сортировка для jqGrid.

Я нашел его чрезвычайно полезным, когда узнал о базовых концепциях выражений.

Самое приятное в этом коде - это то, что он позволяет использовать точечные операторы для геттеров. Person.Age, или если вы хотите нарушить Деметру, вы можете даже сделать несколько геттеров.

Код можно улучшить. Я полагаю, что добавил StartsWith и разрешил его только для строковых операций, а также для нескольких других операций поиска. Независимо от его достоинства, это помогло мне понять выражения linq много.

public static IQueryable<T> Where<T>(this IQueryable<T> query, string column, object value, WhereOperation operation)
{
    if (string.IsNullOrEmpty(column))
        return query;

    ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");

    MemberExpression memberAccess = null;
    foreach (var property in column.Split('.'))
        memberAccess = MemberExpression.Property
           (memberAccess ?? (parameter as Expression), property);

    //change param value type
    //necessary to getting bool from string
    ConstantExpression filter = Expression.Constant
        (
            Convert.ChangeType(value, memberAccess.Type)
        );

    //switch operation
    Expression condition = null;
    LambdaExpression lambda = null;
    switch (operation)
    {
        //equal ==
        case WhereOperation.Equal:
            condition = Expression.Equal(memberAccess, filter);
            lambda = Expression.Lambda(condition, parameter);
            break;
        //not equal !=
        case WhereOperation.NotEqual:
            condition = Expression.NotEqual(memberAccess, filter);
            lambda = Expression.Lambda(condition, parameter);
            break;
        //string.Contains()
        case WhereOperation.Contains:
            condition = Expression.Call(memberAccess,
                typeof(string).GetMethod("Contains"),
                Expression.Constant(value));
            lambda = Expression.Lambda(condition, parameter);
            break;
    }


    MethodCallExpression result = Expression.Call(
           typeof(Queryable), "Where",
           new[] { query.ElementType },
           query.Expression,
           lambda);

    return query.Provider.CreateQuery<T>(result);
}

Идентификатор WhereOperation:

public enum WhereOperation { Equal, NotEqual, Contains }

Ответ 4

Я не думаю, что Microsoft "поддерживается" Microsoft - кажется, выпущена под публичной лицензией, в которой говорится:

(E) Программное обеспечение лицензируется как "есть". Вы несете риск его использования. вкладчики не дают гарантий, гарантий или условий. У вас может быть дополнительный потребитель права в соответствии с вашими местными законами, которые эта лицензия не может измениться. К степень, разрешенная в соответствии с вашими местными законов, вкладчики исключают подразумеваемые гарантии товарности, пригодность для определенной цели и ненарушения.

На ваш второй вопрос, я не думаю, что есть версия .NET 4. 3.5 должен отлично работать в проекте 4.0, и я не думаю, что там очень много, чтобы добавить. Насколько я понимаю, это была отличная небольшая библиотека для выполнения этих случайных одноразовых строковых запросов linq. Возможно, вы по какой-то причине вручную сортировали сетку и нуждались в изменении порядка сортировки коллекций на основе строки, представляющей соответствующее свойство. Вуаля. Я сомневаюсь, что вы увидите много усилий, добавив в него множество функций.