Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Query: Dedupe & simplify materializer #15650

Merged
merged 1 commit into from
May 8, 2019
Merged

Conversation

smitpatel
Copy link
Member

No description provided.

@smitpatel
Copy link
Member Author

Query like this

        [ConditionalTheory]
        [MemberData(nameof(IsAsyncData))]
        public virtual Task Join_customers_orders_entities_same_entity_twice(bool isAsync)
        {
            return AssertQuery<Customer, Order>(
                isAsync,
                (cs, os) =>
                    from c in cs
                    join o in os on c.CustomerID equals o.CustomerID
                    select new
                    {
                        A = c,
                        B = c
                    },
                e => e.A.CustomerID + " " + e.B.CustomerID,
                entryCount: 89);
        }

(c is referenced twice)
generates following shaper expression

(QueryContext queryContext | DbDataReader dataReader) => 
{
    return 
    {
        entity0 = 
        {
            entry1 = InternalEntityEntry queryContext.StateManager.TryGetEntry(
            |__ key: Key: Customer.CustomerID PK, 
            |__ keyValues: new object[]{ (object)string dataReader.GetString(0) }, 
            |__ throwOnNullKey: True, 
            |__ hasNullKey: hasNullKey1)
            return hasNullKey1 ? null : entry1 != null ? (Customer)entry1.Entity : 
            {
                materializationContext1 = new MaterializationContext(
                    ValueBuffer, 
                    queryContext.Context
                )
                instance1 = new Customer(
                    materializationContext1.Context, 
                    ILazyLoader GetService((IInfrastructure<IServiceProvider>)materializationContext1.Context), 
                    string dataReader.GetString(0)
                )
                instance1.Context = (materializationContext1.Context as NorthwindContext)
                instance1.<Address>k__BackingField = bool dataReader.IsDBNull(1) ? default(string) : string dataReader.GetString(1)
                instance1.<City>k__BackingField = bool dataReader.IsDBNull(2) ? default(string) : string dataReader.GetString(2)
                instance1.<CompanyName>k__BackingField = bool dataReader.IsDBNull(3) ? default(string) : string dataReader.GetString(3)
                instance1.<ContactName>k__BackingField = bool dataReader.IsDBNull(4) ? default(string) : string dataReader.GetString(4)
                instance1.<ContactTitle>k__BackingField = bool dataReader.IsDBNull(5) ? default(string) : string dataReader.GetString(5)
                instance1.<Country>k__BackingField = bool dataReader.IsDBNull(6) ? default(string) : string dataReader.GetString(6)
                instance1.<Fax>k__BackingField = bool dataReader.IsDBNull(7) ? default(string) : string dataReader.GetString(7)
                instance1.<Phone>k__BackingField = bool dataReader.IsDBNull(8) ? default(string) : string dataReader.GetString(8)
                instance1.<PostalCode>k__BackingField = bool dataReader.IsDBNull(9) ? default(string) : string dataReader.GetString(9)
                instance1.<Region>k__BackingField = bool dataReader.IsDBNull(10) ? default(string) : string dataReader.GetString(10)
                void queryContext.StartTracking(
                    entityType: EntityType: Customer, 
                    entity: instance1, 
                    valueBuffer: new ValueBuffer(new object[]{ }))
                return instance1
            }
        }
        return new { 
            A = entity0, 
            B = entity0
         }
    }
}

@smitpatel
Copy link
Member Author

Shaper when projection in above query is new { c, o }

(QueryContext queryContext | DbDataReader dataReader) => 
{
    return new { 
        c = 
        {
            entry1 = InternalEntityEntry queryContext.StateManager.TryGetEntry(
            |__ key: Key: Customer.CustomerID PK, 
            |__ keyValues: new object[]{ (object)string dataReader.GetString(0) }, 
            |__ throwOnNullKey: True, 
            |__ hasNullKey: hasNullKey1)
            return hasNullKey1 ? null : entry1 != null ? (Customer)entry1.Entity : 
            {
                materializationContext1 = new MaterializationContext(
                    ValueBuffer, 
                    queryContext.Context
                )
                instance1 = new Customer(
                    materializationContext1.Context, 
                    ILazyLoader GetService((IInfrastructure<IServiceProvider>)materializationContext1.Context), 
                    string dataReader.GetString(0)
                )
                instance1.Context = (materializationContext1.Context as NorthwindContext)
                instance1.<Address>k__BackingField = bool dataReader.IsDBNull(1) ? default(string) : string dataReader.GetString(1)
                instance1.<City>k__BackingField = bool dataReader.IsDBNull(2) ? default(string) : string dataReader.GetString(2)
                instance1.<CompanyName>k__BackingField = bool dataReader.IsDBNull(3) ? default(string) : string dataReader.GetString(3)
                instance1.<ContactName>k__BackingField = bool dataReader.IsDBNull(4) ? default(string) : string dataReader.GetString(4)
                instance1.<ContactTitle>k__BackingField = bool dataReader.IsDBNull(5) ? default(string) : string dataReader.GetString(5)
                instance1.<Country>k__BackingField = bool dataReader.IsDBNull(6) ? default(string) : string dataReader.GetString(6)
                instance1.<Fax>k__BackingField = bool dataReader.IsDBNull(7) ? default(string) : string dataReader.GetString(7)
                instance1.<Phone>k__BackingField = bool dataReader.IsDBNull(8) ? default(string) : string dataReader.GetString(8)
                instance1.<PostalCode>k__BackingField = bool dataReader.IsDBNull(9) ? default(string) : string dataReader.GetString(9)
                instance1.<Region>k__BackingField = bool dataReader.IsDBNull(10) ? default(string) : string dataReader.GetString(10)
                void queryContext.StartTracking(
                    entityType: EntityType: Customer, 
                    entity: instance1, 
                    valueBuffer: new ValueBuffer(new object[]{ }))
                return instance1
            }
        }, 
        o = 
        {
            entry2 = InternalEntityEntry queryContext.StateManager.TryGetEntry(
            |__ key: Key: Order.OrderID PK, 
            |__ keyValues: new object[]{ (object)int dataReader.GetInt32(11) }, 
            |__ throwOnNullKey: True, 
            |__ hasNullKey: hasNullKey2)
            return hasNullKey2 ? null : entry2 != null ? (Order)entry2.Entity : 
            {
                materializationContext2 = new MaterializationContext(
                    ValueBuffer, 
                    queryContext.Context
                )
                instance2 = new Order()
                instance2.<OrderID>k__BackingField = int dataReader.GetInt32(11)
                instance2.<CustomerID>k__BackingField = bool dataReader.IsDBNull(12) ? default(string) : string dataReader.GetString(12)
                instance2.<EmployeeID>k__BackingField = bool dataReader.IsDBNull(13) ? default(Nullable<uint>) : (Nullable<uint>)(uint)int dataReader.GetInt32(13)
                instance2.<OrderDate>k__BackingField = bool dataReader.IsDBNull(14) ? default(Nullable<DateTime>) : (Nullable<DateTime>)DateTime dataReader.GetDateTime(14)
                void queryContext.StartTracking(
                    entityType: EntityType: Order, 
                    entity: instance2, 
                    valueBuffer: new ValueBuffer(new object[]{ }))
                return instance2
            }
        }
     }
}

@natemcmaster
Copy link
Contributor

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@smitpatel smitpatel requested review from maumar and bricelam May 8, 2019 15:21
@smitpatel smitpatel merged commit a5210e3 into master May 8, 2019
@ghost ghost deleted the smit/dedupeEntityShaper branch May 8, 2019 20:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants