Можно ли посчитать количество условий, которые выполнили строки в linq для Entity Framework? - PullRequest
0 голосов
/ 26 октября 2018

Мне было интересно, есть ли способ подсчитать количество условий, которые выполнила строка, чтобы отсортировать возвращаемое значение по тому, которое квалифицировало большинство условий.

Скажем, таблица - это нечтокак это:

this

и, скажем, условие size=M или color=blue или size<40

Что я ожидаюв результате получается что-то вроде этого:

Id3 (3 conditions)
Id4 (2 conditions)
Id1 (1 condition)
Id2 (1 condition)

1 Ответ

0 голосов
/ 26 октября 2018

Вот один из способов реализации условного агрегирования с использованием linq.

Обратите внимание, что мне пришлось немного подправить ваше состояние, потому что вы написали size=M or color=blue or size<40 - но размер - это либо строка, либо число, на самом деле не может быть и тем и другим - поэтому я решил, что это опечатка, и предполагалось, быть size=M or color=blue or value<40.

Кроме того, поскольку вы не предоставили MCVE , я сделал это для вас ( Пожалуйста попробуйте создать MCVE для ваших следующих вопросов)

Итак, давайте начнем с простого класса для данных:

class Data
{
    public Data(string id, string size, int value, string color)
    {
        Id = id;
        Size = size;
        Color = color;
        Value = value;
    }

    public string Id {get;set;}

    public string Size {get;set;}

    public int Value {get;set;}

    public string Color {get;set;} 

    public override string ToString()
    {
        return string.Format("Id = {0}, Size = {1}, Value = {2}, Color = {3}", Id, Size, Value, Color);
    }
}

Теперь давайте создадим список этого класса и наполним его примерами данных, которые вы (вроде) предоставили:

var sampleData = new List<Data>()
{
    new Data("Id1", "L", 35, "red"),
    new Data("Id2", "L", 65, "blue"),
    new Data("Id3", "M", 34, "blue"),
    new Data("Id4", "S", 32, "blue"),
    new Data("Id5", "S", 55, "green")
};

Поскольку я не хотел писать условия дважды, я решил сначала выбрать новый анонимный тип, который содержит класс Data и другое свойство, которое я назвал ConditionsMatched, для хранения количества условий, на которых эти данные фактически выполняются. Матчи. Тогда все, что мне нужно было сделать, это отфильтровать результат этого select, чтобы он возвращал только те случаи, когда ConditionsMatched больше 0:

var result = sampleData
    .Select(d => new 
            {
                Data = d,
                ConditionsMatched = 
                    (d.Size == "M" ? 1 : 0) +
                    (d.Color == "blue" ? 1 : 0) +
                    (d.Value < 40 ? 1 : 0)
            })
    .Where(a => a.ConditionsMatched > 0);

Результатом является IEnumerable<AnonymousType>, который содержит только данные, которые соответствуют хотя бы одному условию.

Вы можете увидеть живое демо на rextester.

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