Линк к объектам динамического где предложение в виде строки - PullRequest
4 голосов
/ 26 мая 2011

Я хочу фильтровать данные динамически, используя linq для сущностей, предоставляя строковое выражение для предложения where.

Например:

string filterExpr = "it.City='London'"
var ret1 = Contex.Customers.Where(filterExpr);

Как я могу сделать то же самое, но на этот раз для фильтрации данных, которые начинаются с некоторой строки?

если невозможно добиться использования строки, как я могу построить соответствующее лямбда-выражение?

(Также для меня важно иметь возможность фильтровать по многим параметрам (ИЛИ / И))

Ответы [ 4 ]

2 голосов
/ 26 мая 2011

Я думаю, что вы можете искать это Dynamic LINQ. Скотт Гатри опубликовал это:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Это не так быстро, как использование лямбда-синтаксиса, поскольку их нужно компилировать во время выполнения, но это может быть ваш ответ.

1 голос
/ 26 мая 2011
Public Shared Function getFilterStartsWith(Of T)(ByVal param As ParameterExpression, ByVal prop As MemberExpression, ByVal arg As Object) As Expression
    Dim mi As MethodInfo = GetType(String).GetMethod("StartsWith", New Type() {GetType(String)}, Nothing)
    Return Expression.Lambda(Of Func(Of T, Boolean))(LambdaExpression.[Call](prop, mi, Expression.Constant(arg, GetType(String))), param)
End Function

В C #:

public static Expression getFilterStartsWith<T>(ParameterExpression param, MemberExpression prop, object arg) {
    MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }, null);
    return Expression.Lambda<Func<T, bool>>(LambdaExpression.Call(prop, mi, Expression.Constant(arg, typeof(string))), param);
}

Это функция, которую я использую для стартов с решением , которое я недавно написал.Это оказалось огромной болью, потому что вы не можете использовать переменную Type в качестве параметра в ctype или DirectCast в vb, и вы не можете выполнять сравнения linq для объекта и обнуляемого объекта одного типа.

0 голосов
/ 05 марта 2015

Забудьте о «волшебных» строках, C # предназначен для строгой типизации. Так или иначе, вы получите список того, где лучше всего, чтобы они были строго напечатаны.

    public class Veg
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool Fruit { get; set; }
    }

    enum Mode
    {
        One,
        Two,
        Three
    }

    static void Main()
    {
        Mode mode = Mode.One;

        var data = new List<Veg>
        {
            new Veg{Id = 1, Name = "Apple", Fruit = true},
            new Veg{Id = 2, Name = "Carrot", Fruit = false}
        };

        var dataSelect = data.Where(w => (mode == Mode.One && w.Fruit) || //only fruits
                                         (mode == Mode.Two && !w.Fruit) || //only not fruits
                                         (mode == Mode.Three)); //all of it
    }
0 голосов
/ 26 мая 2011

пожалуйста, попробуйте это:

var ret1 = contex.Customers.Where(x => x.it.City.StartsWith('l'));

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...