С точки зрения того, как это реализовано, это изменяется метод - от OrderBy/ThenBy до OrderByDescending/ThenByDescending. Однако можно применить вид отдельно к основному запросу...
var qry = from .... // or just dataList.AsEnumerable()/AsQueryable()
if(sortAscending) {
qry = qry.OrderBy(x=>x.Property);
} else {
qry = qry.OrderByDescending(x=>x.Property);
}
Какое-либо использование? Можно создать весь "порядок" динамично, но он более включен...
Другой прием (главным образом соответствующий LINQ к объектам) должен использовать множитель-1/1. Это только действительно полезно для числовых данных, но является развязным способом достигнуть того же результата.
Если вы начнете использовать Moose
, вы найдете MooseX :: Types
по своему вкусу. Типы автоматически имеют is_ $ type () и to_ $ type (). Это сделано для того, чтобы убедиться, что вы вводите ограничения типа проходов или чтобы ваш ввод имел допустимое принуждение к типу. Мне они больше нравятся даже для таких вещей, потому что вы можете гарантировать, что состояние вашего объекта имеет указанные типы без каких-либо дополнительных затрат.
use Moose;
has 'foo' => ( isa => MyType, is => ro );
sub _check_my_type {
my ( $self, $type ) = @_;
is_MyType( $type );
};
Возможно, не хватает некоторой поддержки глубоких / рекурсивных типов, но если вы используете этот материал в современный Perl вы, вероятно, "делаете это неправильно". Вместо этого используйте объект, у которого есть собственные проверки согласованности (например, мой выше с MyType), и просто передайте объект.
Have a look at MooseX::Method::Signatures which provides a bit more than just validating the arguments.
Example from POD:
package Foo;
use Moose;
use MooseX::Method::Signatures;
method morning (Str $name) {
$self->say("Good morning ${name}!");
}
method hello (Str :$who, Int :$age where { $_ > 0 }) {
$self->say("Hello ${who}, I am ${age} years old!");
}
method greet (Str $name, Bool :$excited = 0) {
if ($excited) {
$self->say("GREETINGS ${name}!");
}
else {
$self->say("Hi ${name}!");
}
}
MooseX::Method::Signatures also comes as standard with MooseX::Declare which brings even more sexy syntax to the Perl plate. The above could be written like so (just showing first method for brevity):
use MooseX::Declare;
class Foo {
method morning (Str $name) {
$self->say("Good morning ${name}!");
}
}
There is also a corollary signatures CPAN module for plain subroutines but unfortunately it isn't as feature rich as above.