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 \@arrayFrom sub { ITERATOR }From range => [ $start, $end ]From repeat => [ $value, $count ]Where { CONDITION }Select { EXPRESSION }Join $collection, $hints, $leftexpr, $rightexpr, $joinexprGroupBy { 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, $joinexprRightJoin $collection, $leftexpr, $rightexpr, $joinexprInnerJoin $collection, $leftexpr, $rightexpr, $joinexprOuterJoin $collection, $leftexpr, $rightexpr, $joinexprGroupJoin $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 }CountSequenceEqual $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 $collectionUnion $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 } $defaultLast { TRUTH EXPRESSION }LastOrDefault { TRUTH EXPRESSION } $defaultSingle { TRUTH EXPRESSION }SingleOrDefault { TRUTH EXPRESSION } $defaultElementAt $indexElementAtOrDefault $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.