Click here to Skip to main content
Click here to Skip to main content

LINQ-to-SQL: A Generic Primary Key Function

By , 26 Jun 2008
 

Introduction

Looking around the web today for a method to generically update a property from a DataGrid, using LINQ, I finally found what I was looking for, at: http://csainty.blogspot.com/2008/04/linq-to-sql-generic-primary-key.html.

Since it took a little while to convert it to VB.NET, I figured I would post it here for others to use.

Using the code

Since I'm not yet a very experienced writer, I'll leave it for the reader to make sense of where and how best to use this code. In a nutshell, this code will work in concert with LINQ to SQL to allow you to retrieve a business entity for whatever purpose needed.

Create your new module called DataContextHelpers, as follows:

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

To use this in your code, simply:

Imports yournamespace.DataContextHelpers 

and

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

Note that even with the import, VS2008 still didn't give me full intellisense when I was working on "Common" intellisense mode. It did show up in "All" mode. Also, make sure your project is set to use .NET 3.5, and you have added all the usual references, system.data.linq being the big one to get this to compile.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Bob Housedorf
Software Developer (Senior)
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generaltrying to use it!memberYisman218 Nov '10 - 6:24 
hi
im trying to use ur code but i get an error that the tpye doesnt inherit
i copied ur code verbatim
and it compiles
then i write somewhere else
Dim thisBusinessEntity As Product = dcx.GetByPk(Of Product)(39)
and i get compile time:
"Type argument product does not inherit or implement the constraint type system.type"
what can i do?
thanks
im in vs2010 .net 4
GeneralC# Version [modified]memberMember 384770620 Dec '08 - 15:25 
Thanks, that's very helpful.   Here's a C# version
 

Table<t> table = context.GetTable<t>();
MetaTable mapping = context.Mapping.GetTable(typeof(T));
MetaDataMember pkfield = mapping.RowType.DataMembers.SingleOrDefault(d => d.IsPrimaryKey);
 
if (pkfield == null)
      throw new Exception(String.Format("Table {0} does not contain a Primary Key field",
                                    mapping.TableName));
 

ParameterExpression param = Expression.Parameter(typeof(T), "e");
var p = Expression.Lambda<Func<T, bool>>(
      Expression.Equal(Expression.Property(param, pkfield.Name),
      Expression.Constant(pk)),
      new ParameterExpression[] { param });
 
return table.SingleOrDefault(p);
 
modified on Sunday, December 21, 2008 12:59 AM
 
<div class="ForumMod">modified on Sunday, December 21, 2008 12:59 AM</div>

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 26 Jun 2008
Article Copyright 2008 by Bob Housedorf
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid