2011-08-26 49 views
0

我已经有了一点松懈的项目时间,所以我决定出演一个微型优化剧场。我正在开发的应用程序将在一些性能相当低的平板电脑上运行,所以我一直在寻找加快速度的方法。由于我使用LINQ到实体我看着预编译查询吹嘘的性能,因此想出了这个简单的返回联系人列表对于给定公司编译LINQ加入

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 
                          ) 

现在,这是罚款,它只是一个表所以IQueryable类型可以是表名。我的问题是,如果我想用连接预编译一个查询?例如,这一个

Dim Quote_QRY = 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 Quote_data.ID, Status = Quote_status_data.Description, Quote_data.Contact, Quote_data.Project, Quote_value_data.QuoteValue 

我会怎么去呢?

谢谢

回答

1

这里的加入不是问题。这个问题是投射到一个匿名类型。在这种情况下,你需要在你的SELECT子句中创建一个名为类和项目到它:

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 
        } 

一个额外的警告:我不知道把我的头顶部,如果编译的查询要求生成的类型是否是映射的实体类型。如果是这样,您可能需要更改EDMX以使EF认为该类型是有效的。或者,您可能要考虑在CSDL中使用Defining query

+0

非常感谢,我确实认为我必须自定义课程,而且看起来像我会的, –