Переменное значение потолка по группам с максимальным охватом при использовании LINQ To NHibernate - PullRequest
2 голосов
/ 03 ноября 2011

Я хотел бы построить оператор LINQ GroupBy в соответствии со следующими десятичными категориями: 0-50, 50-100, 100-250, 250 и выше. Я нашел Группирование по диапазону целых чисел с помощью Linq , в котором обсуждается, как использовать диапазон переменных, но этот запрос имеет ограниченную верхнюю границу. Мой запрос должен уметь обрабатывать все, что больше 250, как одну группу. Я попытался использовать decimal.maxValue в качестве моей верхней границы, но запрос не смог обработать его, я полагаю, потому что значение больше, чем то, что может обработать NHibernate. В идеале я хотел бы сделать это без указания максимального значения, чтобы запрос не зависел от базы данных.

Редактировать: я почти уверен, что смогу сделать это, используя массив значений этажей и следуя шаблону в ссылке. Но мне любопытно, есть ли какая-то общая групповая конструкция.

1 Ответ

2 голосов
/ 03 ноября 2011

Редактировать:

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

Математическифункция пола эквивалентна.В случае потолка нижняя граница для данных, которые они использовали, предположительно равна 0. В случае этажа логическая верхняя граница равна положительной бесконечности (фактически она заканчивается как самое высокое значение, которое поддерживает БД, поскольку целые числа не поддерживаютпонятие бесконечности).Он доставит вас туда, куда вы хотите.

Если вы хотите что-то, что может быть более применимо к другим ситуациям, вы можете попробовать что-то вроде этого:

items.GroupBy(item =>
    (
        floors.FirstOrDefault(floor => floor <= item)
            ?? "Default"
        )
        .ToString()
    );

Возможно, это не сработаетв Linq для NHibernate, так как я не думаю, что это будет соответствовать карте SQL.Вместо этого вы можете сначала импортировать весь набор в память (.ToList()), а затем добавить свою группировку в качестве запроса Linq to Objects.

Не имеет смысла использовать его в этой ситуации,но это может произойти в случае группировок без нумерации строк:

var groups = new HashSet<string>
{
    "Orange",
    "Green",
    "Mauve",
};

items.GroupBy(item =>
    groups.Contains(item.Color)
        ? item.Color
        : "Default"
    );

Перед редактированием:

Вы можете просто изменить логику, и вы автоматически включитевсе ниже определенного значения.

var floors = new[] { 250, 100, 50, 0 };
var groupings = items.GroupBy(item => floors.First(floor => floor <= item));

Как это работает:

  • Возьмите предмет 270.
    Первым элементом в списке будет первое ведро, в которое он попадет.Это связано с тем, что 250 <= 270.

  • Возьмите предмет 99.
    Третьим элементом в списке будет первое ведро, в которое он попадет.250 не менее 99.100 не менее 99.Но 50 меньше 99.

  • Элемент 50 попадет в третье ведро.
    Он меньше 250 и 100,но равно 50.

Не совсем соответствует описанию в вашем вопросе:

Описание вашей группы несколько не корректно.Вы должны были бы объединить их отдельно, чтобы этот алгоритм работал.Было бы ведро 0-50, ведро 51-100 и т. Д. Или ведро 0-49, ведро 50-99 и т. Д.

ведро 0-50 и ведро 50-100не существует вместе.

...