Пытаетесь использовать Dynami c LINQ, но не знаете, с чего начать? - PullRequest
0 голосов
/ 08 июля 2020

У меня есть приложение Blazor, которое отображает журнал событий, в котором также есть раскрывающийся список с множественным выбором, который выводит разделяемую строку для типа «SourceContext» для фильтрации. Я хотел бы динамически создать предложение «Где», как показано ниже, приведенный ниже код явно не работает, но представляет то, что я пытаюсь достичь. Я попробовал Predicates и прочитал несколько сайтов Dynami c LINQ, чтобы понять это, и на данный момент я полностью сбит с толку. Спасибо за любую помощь с этим.

    string[] strAr = str.ToString().Split(",");
    string ctxFlt = string.Empty;
    for (int x = 1; x < strAr.Count(); x++)
    {
        if (x == 1)
        {
            ctxFlt += strAr[x].ToString();
        }
        else
        {
            ctxFlt += " and s.SourceContext ==  strAr[x].ToString();
        }
    }
    evLog = logdb.Logs.Where(s => s.SourceContext == $"{ctxFlt}").OrderByDescending(t => t.Timestamp).ToList();

1 Ответ

2 голосов
/ 08 июля 2020

Согласен с Робертом, Contains должно быть достаточно, но вам нужен список (enum), а не массив для .Contains. Ваша реализация Contains - «String внутри String» ie foobar.Contains (foo) not a Linq Contains to build a SQL "WHERE field IN (x, y, z)"

var strAr = str.ToString().Split(",").ToArray().Distinct().ToList();
evLog = logdb.Logs.Where(s => strArs.Contains(s.SourceContext)).OrderByDescending(t => t.Timestamp).ToList();

Но если вам нужен полноценный динамический c запрос, вы бы сделали что-то вроде ниже ...

using System.Linq.Expressions;

            string[] strAr = str.ToString().Split(",");
            Expression conditions = Expression.Constant(false);
            var parameter = Expression.Parameter(typeof(Log), "log");

            for (int i = 0; i < strAr.Count(); i++)
            {
                Expression condition = Expression.Equal(
                        Expression.Property(parameter, "SourceContext"),
                        Expression.Constant(strAr[i])
                        );

                conditions = Expression.OrElse(conditions, condition);
            }

            var expression = Expression.Lambda<Func<Log, Boolean>>(conditions, parameter);

            var q = evLog = logdb.Logs.Where(expression).OrderByDescending(t => t.Timestamp).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...