public static void Making_use_of_variable_multiple_times_doesnt_cause_redundant_joins()
        {
            const string expectedSqlProducts =
                @"SELECT
    [Extent1].[Name] AS [Name]
    FROM   [dbo].[Products] AS [Extent1]
    LEFT OUTER JOIN [dbo].[ProductModels] AS [Extent2] ON [Extent1].[ProductModelID] = [Extent2].[ProductModelID]
    INNER JOIN [dbo].[StringInstruments] AS [Extent3] ON [Extent1].[StringInstrumentId] = [Extent3].[StringInstrumentId]
    WHERE ([Extent2].[ModifiedDate] >= @p__linq__0) AND ([Extent3].[ProductionDate]=@p__linq__1) AND ([Extent2].[ModifiedDate] <= @p__linq__2)";

            const string expectedSqlStrings =
                @"SELECT
    [Extent1].[Name] AS [Name]
    FROM  [dbo].[Strings] AS [Extent1]
    INNER JOIN [dbo].[StringInstruments] AS [Extent2] ON [Extent1].[StringInstrumentId] = [Extent2].[StringInstrumentId]
    WHERE ([Extent2].[ProductionDate] >= @p__linq__0) AND ([Extent2].[ProductionDate] <= @p__linq__1)";

            Database.SetInitializer <Codeplex199Context>(null);

            using (var context = new Codeplex199Context())
            {
                context.Configuration.UseDatabaseNullSemantics = true;
                context.Configuration.LazyLoadingEnabled       = false;

                var MinDate        = new DateTime(2011, 02, 03);
                var MaxDate        = new DateTime(2011, 03, 04);
                var ProductionDate = new DateTime(2011, 03, 04);

                var query = context.Products
                            .Where(p => p.ProductModel.ModifiedDate >= MinDate &&
                                   p.StringInstrument.ProductionDate == ProductionDate &&
                                   p.ProductModel.ModifiedDate <= MaxDate)
                            .Select(p => p.Name);

                QueryTestHelpers.VerifyQuery(query, expectedSqlProducts);

                query = context.Strings
                        .Where(s => s.StringInstrument.ProductionDate >= MinDate &&
                               s.StringInstrument.ProductionDate <= MaxDate)
                        .Select(s => s.Name);

                QueryTestHelpers.VerifyQuery(query, expectedSqlStrings);
            }
        }
        public static void Making_use_of_variable_multiple_times_doesnt_cause_redundant_joins()
        {
            const string expectedSqlProducts =
@"SELECT
    [Extent1].[Name] AS [Name]
    FROM   [dbo].[Products] AS [Extent1]
    LEFT OUTER JOIN [dbo].[ProductModels] AS [Extent2] ON [Extent1].[ProductModelID] = [Extent2].[ProductModelID]
    INNER JOIN [dbo].[StringInstruments] AS [Extent3] ON [Extent1].[StringInstrumentId] = [Extent3].[StringInstrumentId]
    WHERE ([Extent2].[ModifiedDate] >= @p__linq__0) AND ([Extent3].[ProductionDate]=@p__linq__1) AND ([Extent2].[ModifiedDate] <= @p__linq__2)";

            const string expectedSqlStrings = 
@"SELECT
    [Extent1].[Name] AS [Name]
    FROM  [dbo].[Strings] AS [Extent1]
    INNER JOIN [dbo].[StringInstruments] AS [Extent2] ON [Extent1].[StringInstrumentId] = [Extent2].[StringInstrumentId]
    WHERE ([Extent2].[ProductionDate] >= @p__linq__0) AND ([Extent2].[ProductionDate] <= @p__linq__1)";

            Database.SetInitializer<Codeplex199Context>(null);

            using (var context = new Codeplex199Context())
            {
                context.Configuration.UseDatabaseNullSemantics = true;
                context.Configuration.LazyLoadingEnabled = false;

                var MinDate = new DateTime(2011, 02, 03);
                var MaxDate = new DateTime(2011, 03, 04);
                var ProductionDate = new DateTime(2011, 03, 04);

                var query = context.Products
                                   .Where(p => p.ProductModel.ModifiedDate >= MinDate
                                               && p.StringInstrument.ProductionDate == ProductionDate
                                               && p.ProductModel.ModifiedDate <= MaxDate)
                                   .Select(p => p.Name);

                QueryTestHelpers.VerifyQuery(query, expectedSqlProducts);

                query = context.Strings
                               .Where(s => s.StringInstrument.ProductionDate >= MinDate
                                           && s.StringInstrument.ProductionDate <= MaxDate)
                               .Select(s => s.Name);

                QueryTestHelpers.VerifyQuery(query, expectedSqlStrings);
            }
        }