CodeFluent Query Language (CFQL) allows to quickly create simple methods. CFQL provides support for common operations with Table Value Parameters.
To show result of queries we will use the following data:
IN
Using the IN operator you can exclude values that aren’t included in a list. For instance:
load(guid[] ids) WHERE Id IN (@ids)
The generated SQL procedure:
CREATE PROCEDURE [dbo].[Customer_LoadByIdsIn] ( @ids [dbo].[cf_type_Customer_LoadByIdsIn_0] READONLY ) AS SET NOCOUNT ON DECLARE @_c_ids int; SELECT @_c_ids= COUNT(*) FROM @ids SELECT DISTINCT [Customer].[Customer_Id], [Customer].[Customer_Name], [Customer].[Customer_DateOfBirth] FROM [Customer] WHERE [Customer].[Customer_Id] IN (((SELECT * FROM @ids))) RETURN GO
// John and Jane CustomerCollection.LoadByIds(new int[] { 1, 2 }); // Empty result set CustomerCollection.LoadByIds(new int[0]);
Equals (=)
Using the equals (=) operator you can exclude values that aren’t included in a list, but unlike the IN operator, when the list is empty no filter is applied. For instance:
load(guid[] ids) WHERE Id = @ids
The generated SQL procedure:
CREATE PROCEDURE [dbo].[Customer_LoadByIdsEquals] ( @ids [dbo].[cf_type_Customer_LoadByIdsEquals_0] READONLY ) AS SET NOCOUNT ON DECLARE @_c_ids int; SELECT @_c_ids= COUNT(*) FROM @ids SELECT DISTINCT [Customer].[Customer_Id], [Customer].[Customer_Name], [Customer].[Customer_DateOfBirth] FROM [Customer] LEFT OUTER JOIN @ids AS _t_ids ON ((@_c_ids = 0) OR (([Customer].[Customer_Id] = _t_ids.Item))) WHERE ((@_c_ids = 0) OR (([Customer].[Customer_Id] = _t_ids.Item))) RETURN GO
// John and Jane CustomerCollection.LoadByIds(new int[] { 1, 2 }); // John, Jane and Jimmy CustomerCollection.LoadByIds(new int[0]);
Comparison operators: Like, StartsWith, greater than, freetext, etc.
You can use comparison operators between a single value and a TVP:
load(string[] names) WHERE Name STARTSWITH @names
The generated SQL procedure:
CREATE PROCEDURE [dbo].[Customer_LoadByNamesStartsWith] ( @names [dbo].[cf_type_Customer_LoadByNamesStartsWith_0] READONLY ) AS SET NOCOUNT ON DECLARE @_c_names int; SELECT @_c_names= COUNT(*) FROM @names SELECT DISTINCT [Customer].[Customer_Id], [Customer].[Customer_Name], [Customer].[Customer_DateOfBirth] FROM [Customer] LEFT OUTER JOIN @names AS _t_names ON ((@_c_names = 0) OR (([Customer].[Customer_Name] LIKE (_t_names.Item + '%')))) WHERE ((@_c_names = 0) OR (([Customer].[Customer_Name] LIKE (_t_names.Item + '%')))) RETURN GO
// Jane, John CustomerCollection.LoadByNamesStartsWith(new string[] { "Ja", "Jo" }); // Jane, John and Jimmy CustomerCollection.LoadByNamesStartsWith(new string[0]);
Custom
You can use RAW methods with Table Value Parameter. Here’s an example with inline SQL:
LOAD(string[] names) WHERE [EXISTS (SELECT * FROM @names AS n WHERE $Name$ = n.Item)]
The generated SQL procedure:
CREATE PROCEDURE [dbo].[Customer_LoadCustom] ( @names [dbo].[cf_type_Customer_LoadCustom_0] READONLY ) AS SET NOCOUNT ON DECLARE @_c_names int; SELECT @_c_names= COUNT(*) FROM @names SELECT DISTINCT [Customer].[Customer_Id], [Customer].[Customer_Name], [Customer].[Customer_DateOfBirth] FROM [Customer] WHERE EXISTS ( SELECT * FROM @names AS n WHERE [Customer].[Customer_Name] = n.Item ) RETURN GO
// Jane, John CustomerCollection.LoadCustom(new string[] { "Jane", "John" }); // Empty result set CustomerCollection.LoadCustom(new string[0]);
Happy Querying,
The R&D Team.
