Выбор стола - PullRequest
       5

Выбор стола

0 голосов
/ 04 апреля 2020

Пользователь может выбрать любую ячейку из таблицы. Как мне сгенерировать запрос LINQ, если я заранее не знаю, сколько ячеек выберет пользователь?

db.P.Where(p => p.Date == "01.01.2000");
db.P.Where(p => p.FirstName == "Vitaly");

Например, он выберет Дата и Имя будет выглядеть так: enter image description here

Но если вы выберете другую комбинацию или несколько ячеек?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

вы уже знаете, как создавать выражения предикатов (лямбда-выражения)

p => p.FirstName == "Vitaly"

давайте посмотрим на тип этого выражения ...

Func<T,bool> где T это тип вашей сущности

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

Expression<Func<T,bool>>

, если вы выполняете итерации по выбранным ячейкам, вы можете создать эти выражения для каждой клетки ... вопрос сейчас ... что с ними делать ...

вы можете связать эти ...

db.P.Where(lambda1).Where(lambda2)

но то, что вы хотите, более вероятно комбинация ... одно дерево выражений, которое И все остальные деревья выражений

имеют здесь о том, как это сделать ...

0 голосов
/ 04 апреля 2020

Есть несколько способов приблизиться к этому, но я думаю, что простым будет тип фильтра. Поскольку вы допускаете наличие нескольких возможных значений для каждого свойства, фильтр должен содержать коллекции каждого свойства строки, которые можно отфильтровать, и предоставлять функцию сопоставления для проверки строки.

Например:

class Row
{
    public string Date { get; set; }
    public string FirstName { get; set; }
}

class Filter
{
    public ICollection<string> Dates { get; } = new HashSet<string>();
    public ICollection<string> FirstNames { get; } = new HashSet<string>();

    public bool Matches(Row row) =>
        row != null
        && EmptyOrContains(Dates, row.Date)
        && EmptyOrContains(FirstNames, row.FirstName);

    private static bool EmptyOrContains<T>(ICollection<T> filter, T value) =>
        !filter.Any() || filter.Contains(value);
}

Отсюда вы сможете использовать rows.Where(i => filter.Matches(i)), чтобы выбрать все строки, которые соответствуют набору фильтров.

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