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






3.29/5 (5投票s)
这是 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
是使其编译的关键引用。