NAME
LINQ::DSL - alternative syntax for LINQ
ABSTRACT
use LINQ::DSL ':default_safe';
my @people = (
{ name => "Alice", dept => 8 },
{ name => "Bob", dept => 7, this_will => 'be ignored' },
{ name => "Carol", dept => 7 },
{ name => "Dave", dept => 8 },
{ name => "Eve", dept => 1 },
);
my @depts = (
{ dept_name => 'Accounts', id => 1 },
{ dept_name => 'IT', id => 7 },
{ dept_name => 'Marketing', id => 8 },
);
my $collection = Linq {
From \@people;
SelectX 'name', 'dept';
LeftJoin \@depts, field('dept'), field('id'), HashSmush;
OrderBy -string, field('name');
Cast AutoObject;
};
$collection->foreach( sub {
printf "%s from %s\n", $_->name, $_->dept_name;
} );
DESCRIPTION
This module allows you to create and manipulate LINQ::Collection objects using functions instead of chained method calls. The result is a fairly SQL-like syntax.
Linq {...}
returns a LINQ::Collection unless the block includes an aggregating keyword (which must be the final statement in the block). An aggregating keyword will cause Linq
to return the result of that keyword, which is usually a scalar, except in the case of the keyword ToList
.
:essential
These can be imported using use LINQ::DSL ':essential'
.
Linq { BLOCK }
From \@array
From sub { ITERATOR }
From range => [ $start, $end ]
From repeat => [ $value, $count ]
Where { CONDITION }
Select { EXPRESSION }
Join $collection, $hints, $leftexpr, $rightexpr, $joinexpr
GroupBy { EXPRESSION }
ForEach { BLOCK }
DefaultIfEmpty $value
Additionally, :essential
includes HashSmush( $href1, $href2 )
. This combines multiple hashrefs into a single hashref and then converts that to a blessed object using Object::Adhoc. If the hashrefs contain overlapping keys, the first one "wins".
:join
These can be imported using use LINQ::DSL ':join'
.
LeftJoin $collection, $leftexpr, $rightexpr, $joinexpr
RightJoin $collection, $leftexpr, $rightexpr, $joinexpr
InnerJoin $collection, $leftexpr, $rightexpr, $joinexpr
OuterJoin $collection, $leftexpr, $rightexpr, $joinexpr
GroupJoin $collection, $hints, $leftexpr, $rightexpr, $joinexpr
:sort
These can be imported using use LINQ::DSL ':sort'
.
:filter
These can be imported using use LINQ::DSL ':filter'
.
:native
These can be imported using use LINQ::DSL ':native'
. These keywords are aggregating keywords!
:aggregate
These can be imported using use LINQ::DSL ':aggregate'
. These keywords are aggregating keywords!
Min { EXPRESSION }
Max { EXPRESSION }
Sum { EXPRESSION }
Average { EXPRESSION }
Aggregate { EXPRESSION }
Any { TRUTH EXPRESSION }
All { TRUTH EXPRESSION }
Contains $item, sub { COMPARATOR }
Count
SequenceEqual $other_collection
Any
and All
are very generic-sounding keywords, and Any
conflicts with the function of the same name from Types::Standard, so use LINQ::DSL ':aggregate_safe'
can be used to avoid importing those functions.
:field
These can be imported using use LINQ::DSL ':field'
.
See LINQ::Util. SelectX
combines Select
and fields
. WhereX
combines Where
and check_fields
.
:type
These can be imported using use LINQ::DSL ':type'
.
:combine
These can be imported using use LINQ::DSL ':combine'
.
Concat $collection
Union $collection, sub { COMPARATOR }
Intersect $collection, sub { COMPARATOR }
Except $collection, sub { COMPARATOR }
Zip $collection, sub { EXPRESSION }
:get
These can be imported using use LINQ::DSL ':get'
. These keywords are aggregating keywords!
First { TRUTH EXPRESSION }
FirstOrDefault { TRUTH EXPRESSION } $default
Last { TRUTH EXPRESSION }
LastOrDefault { TRUTH EXPRESSION } $default
Single { TRUTH EXPRESSION }
SingleOrDefault { TRUTH EXPRESSION } $default
ElementAt $index
ElementAtOrDefault $index, $default
BUGS
Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=LINQ.
SEE ALSO
LINQ::Collection, LINQ::Utils.
AUTHOR
Toby Inkster <tobyink@cpan.org>.
COPYRIGHT AND LICENCE
This software is copyright (c) 2022 by Toby Inkster.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
DISCLAIMER OF WARRANTIES
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.