开发者

Compiled LINQ joins

I have got a bit of slack project time so I decided to star in a production of micro optimisation theatre. The app I’m working on is going to be run on some quite low performance tablets so I was looking for ways to speed things up. Given that I’m using LINQ to Entities I looked into precompiled queries to boast performance and so came up with this simple one to return a list of contacts for a given company

 Public ReadOnly pContacts_list_query As Func(Of SpiraxDDWEntities, Integer, IQueryable(Of tblContacts)) = _
        CompiledQuery.Compile(Of SpiraxDDWEntities, Integer, IQueryable(Of tblContacts))(Function(ctx As SpiraxDDWEntities, pCompany_ABN As Integer) _
                                                                                           From Contact_data In ctx.tblContacts Where Contact_data.AccountNumber = pCompany_ABN
                                                                                           )

Now that’s fine as its just one table so the IQueryable type can be the table name. My question is what if I wanted to precompile a query with joins? For example this one

    Dim Quote_QRY = From Quote_data In linEntities.tblQuote
                    Join Quote_value_data In linEntities.tblQuoteValue On Quote_data.ID Equals Quote_value_data.QuoteI开发者_高级运维D
                    Join Quote_status_data In linEntities.tblQuoteStatus On Quote_data.Status Equals Quote_status_data.Abbreviation
                    Where Quote_data.AccountNo = Me.txtCompany_ABN.Text
                    Select Quote_data.ID, Status = Quote_status_data.Description, Quote_data.Contact, Quote_data.Project, Quote_value_data.QuoteValue

How would I go about that?

Thanks


The join here isn't the issue. The issue is projecting into an anonymous type. In this case, you need to create a named class and project into it in your select clause:

Public Class Quote
   Public Property ID As String
   Public Property Status As String
   Public Property Contact As String
   Public Property Project As String
   Public Property QuoteValue As String
End Class

 Public ReadOnly Quote_query As Func(Of SpiraxDDWEntities, Integer, IQueryable(Of Quotes)) = _ 
        CompiledQuery.Compile(Of SpiraxDDWEntities, Integer, IQueryable(Of Quotes))(Function(ctx As SpiraxDDWEntities, pCompany_ABN As Integer) 
                    From Quote_data In linEntities.tblQuote 
                    Join Quote_value_data In linEntities.tblQuoteValue On Quote_data.ID Equals Quote_value_data.QuoteID 
                    Join Quote_status_data In linEntities.tblQuoteStatus On Quote_data.Status Equals Quote_status_data.Abbreviation 
                    Where Quote_data.AccountNo = Me.txtCompany_ABN.Text 
                    Select New Quote With {
                       .ID = Quote_data.ID, 
                       .Status = Quote_status_data.Description, 
                       .Contact = Quote_data.Contact, 
                       .Project = Quote_data.Project, 
                       .QuoteValue = Quote_value_data.QuoteValue 
                   }

One additional caveat: I'm not sure off the top of my head if Compiled Query requires that the resulting type be a mapped entity type or not. If so, you may need to alter the EDMX to make EF think that the type is valid. Alternatively, you may want to consider using a Defining query in the CSDL.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜