LINQ::DSL - alternative syntax for LINQ
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; } );
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.
Linq {...}
Linq
ToList
:essential
These can be imported using use LINQ::DSL ':essential'.
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".
HashSmush( $href1, $href2 )
:join
These can be imported using use LINQ::DSL ':join'.
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'.
use LINQ::DSL ':sort'
OrderBy $hints, sub { EXPRESSION }
OrderByDescending $hints, sub { EXPRESSION }
Reverse
:filter
These can be imported using use LINQ::DSL ':filter'.
use LINQ::DSL ':filter'
Distinct { EXPRESSION }
Take $count
TakeWhile { EXPRESSION }
Skip $count
SkipWhile { EXPRESSION }
:native
These can be imported using use LINQ::DSL ':native'. These keywords are aggregating keywords!
use LINQ::DSL ':native'
ToArray
ToDictionary { KEY EXPRESSION }
ToIterator
:aggregate
These can be imported using use LINQ::DSL ':aggregate'. These keywords are aggregating keywords!
use LINQ::DSL ':aggregate'
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.
Any
All
use LINQ::DSL ':aggregate_safe'
:field
These can be imported using use LINQ::DSL ':field'.
use LINQ::DSL ':field'
SelectX @fields
WhereX @checks
field $name
fields @fields
check_fields @checks
See LINQ::Util. SelectX combines Select and fields. WhereX combines Where and check_fields.
SelectX
Select
fields
WhereX
Where
check_fields
:type
These can be imported using use LINQ::DSL ':type'.
use LINQ::DSL ':type'
Cast $type
Cast AutoObject
OfType $type
:combine
These can be imported using use LINQ::DSL ':combine'.
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!
use LINQ::DSL ':get'
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
Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=LINQ.
LINQ::Collection, LINQ::Utils.
Toby Inkster <tobyink@cpan.org>.
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.
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.
To install LINQ, copy and paste the appropriate command in to your terminal.
cpanm
cpanm LINQ
CPAN shell
perl -MCPAN -e shell install LINQ
For more information on module installation, please visit the detailed CPAN module installation guide.