编译LINQ连接

时间:2011-08-26 13:29:16

标签: vb.net linq entity-framework

我的项目时间有点松弛,所以我决定出演微型优化影院。我正在开发的应用程序将在一些性能相当低的平板电脑上运行,所以我一直在寻找加快速度的方法。鉴于我正在使用LINQ to Entities,我调查预编译查询以夸耀性能,因此想出了一个简单的查询以返回给定公司的联系人列表

 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 个答案:

答案 0 :(得分: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