Как сортировать и фильтровать массив объектов ORM в памяти в ColdFusion?

Допустим, у меня есть объект Store, который содержит набор Products. Итак, я беру свои Store и Products вот так:

var store = entityLoadByPK("Store", 13);
var products = store.getProducts();

Теперь я хотел бы отсортировать и отфильтровать Products, который на данный момент является коллекцией в памяти (давайте предположим, что прокси были разрешены). Возможно ли это в ColdFusion, и если да, то как мне это сделать?

Примечание: я в основном ищу что-то похожее на функции C# LINQ, где я могу сделать:

var store = session.Query<Store>().Single(x => x.Id == 13);
var products = store.GetProducts();
var sortedProducts = products.OrderBy(x => x.Name).ToList();
var filteredProducts = products.Where(x => x.Name.Contains("Shampoo"));

person Daniel T.    schedule 09.09.2011    source источник


Ответы (3)


Я думаю, вам нужно использовать HQL, чтобы это произошло. У меня есть вопрос, который я разместил некоторое время назад. было связано с возвратом предметов в определенном порядке. В итоге я создал собственный метод getProducts вместо использования встроенного геттера. Затем этот метод get запускал необходимый HQL для возврата записей в требуемом порядке.

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

public Products[] function getProducts(string SortColumn = "Name"){
    return EntityLoad("Products", {FKID = getID()}, Arguments.SortColumn & " ASC")
}

В приведенном выше случае FKID — это столбец внешнего ключа в вашей таблице продуктов, а getID — это получатель по умолчанию для PK в вашем объекте Store.

Я обновил ответ, чтобы вы также могли передать значение сортировки :). Должен держать это в моде ...

person Dan Short    schedule 09.09.2011

Вы также можете указать поведение сравнения и сортировки по умолчанию для реляционной коллекции, объявив атрибуты свойств «where» и «orderBy» в родительском объекте отношения «один ко многим» или «многие ко многим». Ниже приведен сокращенный пример, за которым следует ссылка на сопроводительную документацию.

Родитель.cfc

component persistent="true"
{
     property cfc="Child" fieldType="one-to-many" name="Children" where="Age >= 18" orderBy="Name ASC, Age DESC"
}

Child.cfc

component persistent="true"
{
     property cfc="Parent" fieldType="many-to-one" name="Parent"
}

Справочник

Adobe ColdFusion 9 > ORM > Сопоставление > Определить Отношения

person Timothy Allyn Drake    schedule 10.09.2011

Нет ничего похожего на то, на что ты надеешься... Боже, как бы я хотел, чтобы это было!

Вот лучшее, что я могу найти для вас: http://cookbooks.adobe.com/post_How_to_sort_an_array_of_objects_or_entities_with_C-17958.html

person Shannon Hicks    schedule 09.09.2011
comment
Но OP использует ORM, поэтому вы можете использовать встроенные функции ORM и Hibernate для сортировки массива перед его возвратом. Прямые массивы? Неа. ORM-массивы? Конечно! :) - person Dan Short; 10.09.2011
comment
Я думаю, что в конечном итоге я создам репозиторий для моего Products и получу к нему доступ. На самом деле не большой поклонник заполнения моей сущности Store кучей методов для фильтрации Products, хотя Product мало что значит без Store. - person Daniel T.; 10.09.2011