// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Data.Common; using System.Linq; using EntityFrameworkCore.Jet.Data; using System.Data.OleDb; using System.Runtime.CompilerServices; using System.Threading.Tasks; using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.TestUtilities; using Xunit; using Xunit.Abstractions; namespace EntityFrameworkCore.Jet.FunctionalTests.Query { public class FromSqlQueryJetTest : FromSqlQueryTestBase> { public FromSqlQueryJetTest(NorthwindQueryJetFixture fixture, ITestOutputHelper testOutputHelper) : base(fixture) { //Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); } public override async Task FromSqlRaw_queryable_simple(bool async) { await base.FromSqlRaw_queryable_simple(async); AssertSql( $@"SELECT * FROM ""Customers"" WHERE ""ContactName"" LIKE '%z%'"); } public override async Task FromSqlRaw_queryable_simple_columns_out_of_order(bool async) { await base.FromSqlRaw_queryable_simple_columns_out_of_order(async); AssertSql( $@"SELECT ""Region"", ""PostalCode"", ""Phone"", ""Fax"", ""CustomerID"", ""Country"", ""ContactTitle"", ""ContactName"", ""CompanyName"", ""City"", ""Address"" FROM ""Customers"""); } public override async Task FromSqlRaw_queryable_simple_columns_out_of_order_and_extra_columns(bool async) { await base.FromSqlRaw_queryable_simple_columns_out_of_order_and_extra_columns(async); AssertSql( $@"SELECT ""Region"", ""PostalCode"", ""PostalCode"" AS ""Foo"", ""Phone"", ""Fax"", ""CustomerID"", ""Country"", ""ContactTitle"", ""ContactName"", ""CompanyName"", ""City"", ""Address"" FROM ""Customers"""); } public override async Task FromSqlRaw_queryable_composed(bool async) { var queryString = await base.FromSqlRaw_queryable_composed(async); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" ) AS `c` WHERE CHARINDEX('z', `c`.`ContactName`) > 0"); return queryString; } public override async Task FromSqlRaw_queryable_composed_after_removing_whitespaces(bool async) { await base.FromSqlRaw_queryable_composed_after_removing_whitespaces(async); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" ) AS `c` WHERE CHARINDEX('z', `c`.`ContactName`) > 0"); } public override async Task FromSqlRaw_queryable_composed_compiled(bool async) { await base.FromSqlRaw_queryable_composed_compiled(async); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" ) AS `c` WHERE CHARINDEX('z', `c`.`ContactName`) > 0"); } public override async Task FromSqlRaw_queryable_composed_compiled_with_DbParameter(bool async) { await base.FromSqlRaw_queryable_composed_compiled_with_DbParameter(async); AssertSql( $@"customer='CONSH' (Nullable = false) (Size = 5) SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" WHERE ""CustomerID"" = {AssertSqlHelper.Parameter("@customer")} ) AS `c` WHERE CHARINDEX('z', `c`.`ContactName`) > 0"); } public override async Task FromSqlRaw_queryable_composed_compiled_with_nameless_DbParameter(bool async) { await base.FromSqlRaw_queryable_composed_compiled_with_nameless_DbParameter(async); AssertSql( $@"p0='CONSH' (Nullable = false) (Size = 5) SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" WHERE ""CustomerID"" = {AssertSqlHelper.Parameter("@p0")} ) AS `c` WHERE CHARINDEX('z', `c`.`ContactName`) > 0"); } public override void FromSqlRaw_queryable_composed_compiled_with_parameter() { base.FromSqlRaw_queryable_composed_compiled_with_parameter(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" WHERE ""CustomerID"" = 'CONSH' ) AS `c` WHERE CHARINDEX('z', `c`.`ContactName`) > 0"); } public override void FromSqlRaw_composed_contains() { base.FromSqlRaw_composed_contains(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` WHERE `c`.`CustomerID` IN ( SELECT `o`.`CustomerID` FROM ( SELECT * FROM ""Orders"" ) AS `o` )"); } public override void FromSqlRaw_composed_contains2() { base.FromSqlRaw_composed_contains2(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c` WHERE (`c`.`CustomerID` = 'ALFKI') AND `c`.`CustomerID` IN ( SELECT `o`.`CustomerID` FROM ( SELECT * FROM ""Orders"" ) AS `o` )"); } public override void FromSqlRaw_queryable_multiple_composed() { base.FromSqlRaw_queryable_multiple_composed(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" ) AS `c`, ( SELECT * FROM ""Orders"" ) AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`"); } public override void FromSqlRaw_queryable_multiple_composed_with_closure_parameters() { base.FromSqlRaw_queryable_multiple_composed_with_closure_parameters(); AssertSql( $@"p0='1997-01-01T00:00:00' p1='1998-01-01T00:00:00' SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" ) AS `c`, ( SELECT * FROM ""Orders"" WHERE ""OrderDate"" BETWEEN {AssertSqlHelper.Parameter("@p0")} AND {AssertSqlHelper.Parameter("@p1")} ) AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`"); } public override void FromSqlRaw_queryable_multiple_composed_with_parameters_and_closure_parameters() { base.FromSqlRaw_queryable_multiple_composed_with_parameters_and_closure_parameters(); AssertSql( $@"p0='London' (Size = 4000) p1='1997-01-01T00:00:00' p2='1998-01-01T00:00:00' SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} ) AS `c`, ( SELECT * FROM ""Orders"" WHERE ""OrderDate"" BETWEEN {AssertSqlHelper.Parameter("@p1")} AND {AssertSqlHelper.Parameter("@p2")} ) AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`", // $@"p0='Berlin' (Size = 4000) p1='1998-04-01T00:00:00' p2='1998-05-01T00:00:00' SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} ) AS `c`, ( SELECT * FROM ""Orders"" WHERE ""OrderDate"" BETWEEN {AssertSqlHelper.Parameter("@p1")} AND {AssertSqlHelper.Parameter("@p2")} ) AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`"); } public override void FromSqlRaw_queryable_multiple_line_query() { base.FromSqlRaw_queryable_multiple_line_query(); AssertSql( $@"SELECT * FROM ""Customers"" WHERE ""City"" = 'London'"); } public override void FromSqlRaw_queryable_composed_multiple_line_query() { base.FromSqlRaw_queryable_composed_multiple_line_query(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" ) AS `c` WHERE `c`.`City` = 'London'"); } public override void FromSqlRaw_queryable_with_parameters() { base.FromSqlRaw_queryable_with_parameters(); AssertSql( $@"p0='London' (Size = 4000) p1='Sales Representative' (Size = 4000) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")}"); } public override void FromSqlRaw_queryable_with_parameters_inline() { base.FromSqlRaw_queryable_with_parameters_inline(); AssertSql( $@"p0='London' (Size = 4000) p1='Sales Representative' (Size = 4000) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")}"); } public override void FromSqlInterpolated_queryable_with_parameters_interpolated() { base.FromSqlInterpolated_queryable_with_parameters_interpolated(); AssertSql( $@"p0='London' (Size = 4000) p1='Sales Representative' (Size = 4000) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")}"); } public override void FromSqlInterpolated_queryable_with_parameters_inline_interpolated() { base.FromSqlInterpolated_queryable_with_parameters_inline_interpolated(); AssertSql( $@"p0='London' (Size = 4000) p1='Sales Representative' (Size = 4000) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")}"); } public override void FromSqlInterpolated_queryable_multiple_composed_with_parameters_and_closure_parameters_interpolated() { base.FromSqlInterpolated_queryable_multiple_composed_with_parameters_and_closure_parameters_interpolated(); AssertSql( $@"p0='London' (Size = 4000) p1='1997-01-01T00:00:00' p2='1998-01-01T00:00:00' SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} ) AS `c`, ( SELECT * FROM ""Orders"" WHERE ""OrderDate"" BETWEEN {AssertSqlHelper.Parameter("@p1")} AND {AssertSqlHelper.Parameter("@p2")} ) AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`", // $@"p0='Berlin' (Size = 4000) p1='1998-04-01T00:00:00' p2='1998-05-01T00:00:00' SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} ) AS `c`, ( SELECT * FROM ""Orders"" WHERE ""OrderDate"" BETWEEN {AssertSqlHelper.Parameter("@p1")} AND {AssertSqlHelper.Parameter("@p2")} ) AS `o` WHERE `c`.`CustomerID` = `o`.`CustomerID`"); } public override void FromSqlRaw_queryable_with_null_parameter() { base.FromSqlRaw_queryable_with_null_parameter(); AssertSql( $@"p0=NULL (Nullable = false) SELECT * FROM ""Employees"" WHERE ""ReportsTo"" = {AssertSqlHelper.Parameter("@p0")} OR (""ReportsTo"" IS NULL AND {AssertSqlHelper.Parameter("@p0")} IS NULL)"); } public override string FromSqlRaw_queryable_with_parameters_and_closure() { var queryString = base.FromSqlRaw_queryable_with_parameters_and_closure(); AssertSql( $@"p0='London' (Size = 4000) {AssertSqlHelper.Declaration("@__contactTitle_1='Sales Representative' (Size = 4000)")} SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} ) AS `c` WHERE `c`.`ContactTitle` = {AssertSqlHelper.Parameter("@__contactTitle_1")}"); return queryString; } public override void FromSqlRaw_queryable_simple_cache_key_includes_query_string() { base.FromSqlRaw_queryable_simple_cache_key_includes_query_string(); AssertSql( $@"SELECT * FROM ""Customers"" WHERE ""City"" = 'London'", // $@"SELECT * FROM ""Customers"" WHERE ""City"" = 'Seattle'"); } public override void FromSqlRaw_queryable_with_parameters_cache_key_includes_parameters() { base.FromSqlRaw_queryable_with_parameters_cache_key_includes_parameters(); AssertSql( $@"p0='London' (Size = 4000) p1='Sales Representative' (Size = 4000) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")}", // $@"p0='Madrid' (Size = 4000) p1='Accounting Manager' (Size = 4000) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")}"); } public override void FromSqlRaw_queryable_simple_as_no_tracking_not_composed() { base.FromSqlRaw_queryable_simple_as_no_tracking_not_composed(); AssertSql( $@"SELECT * FROM ""Customers"""); } public override void FromSqlRaw_queryable_simple_projection_composed() { base.FromSqlRaw_queryable_simple_projection_composed(); // issue #16079 // AssertSql( // $@"SELECT `p`.`ProductName` //FROM ( // SELECT * // FROM ""Products"" // WHERE ""Discontinued"" <> True // AND ((""UnitsInStock"" + ""UnitsOnOrder"") < ""ReorderLevel"") //) AS `p`"); } public override void FromSqlRaw_queryable_simple_include() { base.FromSqlRaw_queryable_simple_include(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" ) AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); } public override void FromSqlRaw_queryable_simple_composed_include() { base.FromSqlRaw_queryable_simple_composed_include(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" ) AS `c` LEFT JOIN `Orders` AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` WHERE `c`.`City` = 'London' ORDER BY `c`.`CustomerID`, `o`.`OrderID`"); } public override void FromSqlRaw_annotations_do_not_affect_successive_calls() { base.FromSqlRaw_annotations_do_not_affect_successive_calls(); AssertSql( $@"SELECT * FROM ""Customers"" WHERE ""ContactName"" LIKE '%z%'", // $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM `Customers` AS `c`"); } public override void FromSqlRaw_composed_with_nullable_predicate() { base.FromSqlRaw_composed_with_nullable_predicate(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" ) AS `c` WHERE (`c`.`ContactName` = `c`.`CompanyName`) OR (`c`.`ContactName` IS NULL AND `c`.`CompanyName` IS NULL)"); ; } public override void FromSqlRaw_with_dbParameter() { base.FromSqlRaw_with_dbParameter(); AssertSql( $@"{AssertSqlHelper.Declaration("@city='London' (Nullable = false) (Size = 6)")} SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")}"); } public override void FromSqlRaw_with_dbParameter_without_name_prefix() { base.FromSqlRaw_with_dbParameter_without_name_prefix(); AssertSql( $@"city='London' (Nullable = false) (Size = 6) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")}"); } public override void FromSqlRaw_with_dbParameter_mixed() { base.FromSqlRaw_with_dbParameter_mixed(); AssertSql( $@"p0='London' (Size = 4000) {AssertSqlHelper.Declaration("@title='Sales Representative' (Nullable = false) (Size = 20)")} SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@title")}", // $@"{AssertSqlHelper.Declaration("@city='London' (Nullable = false) (Size = 6)")} p1='Sales Representative' (Size = 4000) SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")}"); } public override void FromSqlRaw_with_db_parameters_called_multiple_times() { base.FromSqlRaw_with_db_parameters_called_multiple_times(); AssertSql( $@"{AssertSqlHelper.Declaration("@id='ALFKI' (Nullable = false) (Size = 5)")} SELECT * FROM ""Customers"" WHERE ""CustomerID"" = {AssertSqlHelper.Parameter("@id")}", // $@"{AssertSqlHelper.Declaration("@id='ALFKI' (Nullable = false) (Size = 5)")} SELECT * FROM ""Customers"" WHERE ""CustomerID"" = {AssertSqlHelper.Parameter("@id")}"); } public override void FromSqlRaw_with_SelectMany_and_include() { base.FromSqlRaw_with_SelectMany_and_include(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `c0`.`CustomerID`, `c0`.`Address`, `c0`.`City`, `c0`.`CompanyName`, `c0`.`ContactName`, `c0`.`ContactTitle`, `c0`.`Country`, `c0`.`Fax`, `c0`.`Phone`, `c0`.`PostalCode`, `c0`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Customers"" WHERE ""CustomerID"" = 'ALFKI' ) AS `c`, ( SELECT * FROM ""Customers"" WHERE ""CustomerID"" = 'AROUT' ) AS `c0` LEFT JOIN `Orders` AS `o` ON `c0`.`CustomerID` = `o`.`CustomerID` ORDER BY `c`.`CustomerID`, `c0`.`CustomerID`, `o`.`OrderID`"); } public override void FromSqlRaw_with_join_and_include() { base.FromSqlRaw_with_join_and_include(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`, `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `o0`.`OrderID`, `o0`.`ProductID`, `o0`.`Discount`, `o0`.`Quantity`, `o0`.`UnitPrice` FROM ( SELECT * FROM ""Customers"" WHERE ""CustomerID"" = 'ALFKI' ) AS `c` INNER JOIN ( SELECT * FROM ""Orders"" WHERE ""OrderID"" <> 1 ) AS `o` ON `c`.`CustomerID` = `o`.`CustomerID` LEFT JOIN `Order Details` AS `o0` ON `o`.`OrderID` = `o0`.`OrderID` ORDER BY `c`.`CustomerID`, `o`.`OrderID`, `o0`.`OrderID`, `o0`.`ProductID`"); } public override void FromSqlInterpolated_with_inlined_db_parameter() { base.FromSqlInterpolated_with_inlined_db_parameter(); AssertSql( $@"{AssertSqlHelper.Declaration("@somename='ALFKI' (Nullable = false) (Size = 5)")} SELECT * FROM ""Customers"" WHERE ""CustomerID"" = {AssertSqlHelper.Parameter("@somename")}"); } public override void FromSqlInterpolated_with_inlined_db_parameter_without_name_prefix() { base.FromSqlInterpolated_with_inlined_db_parameter_without_name_prefix(); AssertSql( $@"somename='ALFKI' (Nullable = false) (Size = 5) SELECT * FROM ""Customers"" WHERE ""CustomerID"" = {AssertSqlHelper.Parameter("@somename")}"); } [ConditionalFact] public virtual void FromSqlRaw_in_subquery_with_dbParameter() { using (var context = CreateContext()) { var actual = context.Orders.Where( o => context.Customers .FromSqlRaw( $@"SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")}", // ReSharper disable once FormatStringProblem new OleDbParameter("@city", "London")) .Select(c => c.CustomerID) .Contains(o.CustomerID)) .ToArray(); Assert.Equal(46, actual.Length); AssertSql( $@"{AssertSqlHelper.Declaration("@city='London' (Nullable = false) (Size = 6)")} SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` WHERE `o`.`CustomerID` IN ( SELECT `c`.`CustomerID` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")} ) AS `c` )"); } } [ConditionalFact] public virtual void FromSqlRaw_in_subquery_with_positional_dbParameter_without_name() { using (var context = CreateContext()) { var actual = context.Orders.Where( o => context.Customers .FromSqlRaw( @"SELECT * FROM ""Customers"" WHERE ""City"" = {0}", // ReSharper disable once FormatStringProblem new OleDbParameter { Value = "London" }) .Select(c => c.CustomerID) .Contains(o.CustomerID)) .ToArray(); Assert.Equal(46, actual.Length); AssertSql( $@"p0='London' (Nullable = false) (Size = 6) SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` WHERE `o`.`CustomerID` IN ( SELECT `c`.`CustomerID` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} ) AS `c` )"); } } [ConditionalFact] public virtual void FromSqlRaw_in_subquery_with_positional_dbParameter_with_name() { using (var context = CreateContext()) { var actual = context.Orders.Where( o => context.Customers .FromSqlRaw( @"SELECT * FROM ""Customers"" WHERE ""City"" = {0}", // ReSharper disable once FormatStringProblem new OleDbParameter("@city", "London")) .Select(c => c.CustomerID) .Contains(o.CustomerID)) .ToArray(); Assert.Equal(46, actual.Length); AssertSql( $@"{AssertSqlHelper.Declaration("@city='London' (Nullable = false) (Size = 6)")} SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` WHERE `o`.`CustomerID` IN ( SELECT `c`.`CustomerID` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")} ) AS `c` )"); } } [ConditionalFact] public virtual void FromSqlRaw_with_dbParameter_mixed_in_subquery() { using (var context = CreateContext()) { const string city = "London"; const string title = "Sales Representative"; var actual = context.Orders.Where( o => context.Customers .FromSqlRaw( $@"SELECT * FROM ""Customers"" WHERE ""City"" = {0} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@title")}", city, // ReSharper disable once FormatStringProblem new OleDbParameter("@title", title)) .Select(c => c.CustomerID) .Contains(o.CustomerID)) .ToArray(); Assert.Equal(26, actual.Length); actual = context.Orders.Where( o => context.Customers .FromSqlRaw( $@"SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")} AND ""ContactTitle"" = {1}", // ReSharper disable once FormatStringProblem new OleDbParameter("@city", city), title) .Select(c => c.CustomerID) .Contains(o.CustomerID)) .ToArray(); Assert.Equal(26, actual.Length); AssertSql( $@"p0='London' (Size = 4000) {AssertSqlHelper.Declaration("@title='Sales Representative' (Nullable = false) (Size = 20)")} SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` WHERE `o`.`CustomerID` IN ( SELECT `c`.`CustomerID` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@p0")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@title")} ) AS `c` )", // $@"{AssertSqlHelper.Declaration("@city='London' (Nullable = false) (Size = 6)")} p1='Sales Representative' (Size = 4000) SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM `Orders` AS `o` WHERE `o`.`CustomerID` IN ( SELECT `c`.`CustomerID` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = {AssertSqlHelper.Parameter("@city")} AND ""ContactTitle"" = {AssertSqlHelper.Parameter("@p1")} ) AS `c` )"); } } public override void FromSqlInterpolated_parameterization_issue_12213() { base.FromSqlInterpolated_parameterization_issue_12213(); AssertSql( $@"p0='10300' SELECT * FROM ""Orders"" WHERE ""OrderID"" >= {AssertSqlHelper.Parameter("@p0")}", // $@"{AssertSqlHelper.Declaration("@__max_0='10400'")} p0='10300' SELECT `o`.`OrderID` FROM `Orders` AS `o` WHERE (`o`.`OrderID` <= {AssertSqlHelper.Parameter("@__max_0")}) AND `o`.`OrderID` IN ( SELECT `o0`.`OrderID` FROM ( SELECT * FROM ""Orders"" WHERE ""OrderID"" >= {AssertSqlHelper.Parameter("@p0")} ) AS `o0` )", // $@"{AssertSqlHelper.Declaration("@__max_0='10400'")} p0='10300' SELECT `o`.`OrderID` FROM `Orders` AS `o` WHERE (`o`.`OrderID` <= {AssertSqlHelper.Parameter("@__max_0")}) AND `o`.`OrderID` IN ( SELECT `o0`.`OrderID` FROM ( SELECT * FROM ""Orders"" WHERE ""OrderID"" >= {AssertSqlHelper.Parameter("@p0")} ) AS `o0` )"); } public override void FromSqlRaw_does_not_parameterize_interpolated_string() { base.FromSqlRaw_does_not_parameterize_interpolated_string(); AssertSql( $@"p0='10250' SELECT * FROM ""Orders"" WHERE ""OrderID"" < {AssertSqlHelper.Parameter("@p0")}"); } public override void Entity_equality_through_fromsql() { base.Entity_equality_through_fromsql(); AssertSql( $@"SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` FROM ( SELECT * FROM ""Orders"" ) AS `o` LEFT JOIN `Customers` AS `c` ON `o`.`CustomerID` = `c`.`CustomerID` WHERE `c`.`CustomerID` = 'VINET'"); } public override void FromSqlRaw_with_set_operation() { base.FromSqlRaw_with_set_operation(); AssertSql( $@"SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = 'London' ) AS `c` UNION ALL SELECT `c0`.`CustomerID`, `c0`.`Address`, `c0`.`City`, `c0`.`CompanyName`, `c0`.`ContactName`, `c0`.`ContactTitle`, `c0`.`Country`, `c0`.`Fax`, `c0`.`Phone`, `c0`.`PostalCode`, `c0`.`Region` FROM ( SELECT * FROM ""Customers"" WHERE ""City"" = 'Berlin' ) AS `c0`"); } protected override DbParameter CreateDbParameter(string name, object value) => new OleDbParameter { ParameterName = name, Value = value }; private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); } }