65.9K
CodeProject 正在变化。 阅读更多。
Home

LINQ-to-SQL:通用的主键函数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.29/5 (5投票s)

2008年6月26日

CPOL
viewsIcon

31303

这是 Chris Sainty 的博客文章中的代码的 VB.NET 版本。

引言

今天在网上寻找一种使用 LINQ 从 DataGrid 通用更新属性的方法,最终在以下网址找到了我想要的东西:http://csainty.blogspot.com/2008/04/linq-to-sql-generic-primary-key.html

由于将其转换为 VB.NET 花费了一些时间,我想把它发布在这里供其他人使用。

使用代码

由于我还没有成为一名经验丰富的作者,我将让读者自行理解在何处以及如何最好地使用这段代码。 简而言之,这段代码将与 LINQ to SQL 协同工作,允许您检索业务实体以满足任何所需目的。

创建名为 DataContextHelpers 的新模块,如下所示

Imports System.Runtime.CompilerServices

Imports System
Imports System.Data
Imports System.Configuration
Imports System.Linq
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Xml.Linq
Imports System.Data.Linq
Imports System.Linq.Expressions

Public Module DataContextHelpers

    <extension()> _
    Public Function GetByPk(Of T As Class)(ByVal context As DataContext, _
                                           ByVal pk As Object) As T
        Dim table = context.GetTable(Of T)()
        Dim mapping = context.Mapping.GetTable(GetType(T))
        Dim pkfield = mapping.RowType.DataMembers.SingleOrDefault(Function(d) d.IsPrimaryKey)

        If (pkfield Is Nothing) Then
            Throw New Exception(String.Format("Table {0} does not " & _ 
                      "contain a Primary Key field", _
                      mapping.TableName))
        End If

        Dim param = Expression.Parameter(GetType(T), "e")
        Dim predicate = Expression.Lambda(Of Func(Of T, Boolean)) _
                        (Expression.Equal(Expression.Property(param, pkfield.Name), _
                                          Expression.Constant(pk)), _
                                          New ParameterExpression() {param})
        Return table.SingleOrDefault(predicate)
    End Function

End Module

要在代码中使用它,只需

Imports yournamespace.DataContextHelpers 

Dim thisBusinessEntity As businessEntity = db.GetByPk(Of businessEntity )(key) 

请注意,即使导入了该命名空间,VS2008 在“Common”智能感知模式下仍然没有向我提供完整的智能感知。 它在“All”模式下显示出来。 另外,请确保您的项目设置为使用 .NET 3.5,并且您已添加所有常规引用,其中 system.data.linq 是使其编译的关键引用。

© . All rights reserved.