Click here to Skip to main content
11,646,594 members (75,806 online)
Click here to Skip to main content
Add your own
alternative version

Implementing the Repository Pattern with LINQ-to-SQL

, 4 Jun 2008 CPOL 157K 2.5K 76
The purpose of this article is to describe the technique I have used to implement the Repository pattern in .NET applications.
linqrepository.zip
LinqRepository
_ReSharper.LinqRepository
07541158-425c-4519-b902-b199a7140725.Metadata
07541158-425c-4519-b902-b199a7140725.XmlDocIndex
2e49383c-dec0-4d9e-8be7-633008f2a606.Metadata
2e49383c-dec0-4d9e-8be7-633008f2a606.XmlDocIndex
6cd43b2d-bac7-4b87-8ada-36876af30225.Metadata
6cd43b2d-bac7-4b87-8ada-36876af30225.XmlDocIndex
b2fb99a4-51c4-47f3-a6c7-5555dd6dc7ed.Metadata
b2fb99a4-51c4-47f3-a6c7-5555dd6dc7ed.XmlDocIndex
c5276ef7-0e3d-471e-a623-7e77531f4e0c.Metadata
c5276ef7-0e3d-471e-a623-7e77531f4e0c.XmlDocIndex
CachesImage.bin
TodoCache
.version
7
7e34393a.dat
WordIndex.New
.version
4
25485d06.dat
LinqRepository.4.0.resharper
LinqRepository.4.0.resharper.user
LinqRepository
bin
Debug
LinqRepository.dll
Properties
RepositoryDiagram.cd
RepositoryDiagram.gif
using System;
using System.Collections.Generic;
using System.Linq;

public class Repository<T> : IRepository<T> 
    where T : class
{
    protected IDataContextFactory _dataContextFactory;

    /// <summary>
    /// Return all instances of type T.
    /// </summary>
    /// <returns></returns>
    public IEnumerable<T> All()
    {
        return GetTable;
    }

    /// <summary>
    /// Return all instances of type T that match the expression exp.
    /// </summary>
    /// <param name="exp"></param>
    /// <returns></returns>
    public IEnumerable<T> FindAll(Func<T, bool> exp)
    {
        return GetTable.Where<T>(exp);
    }

    /// <summary>See _vertexRepository.</summary>
    /// <param name="exp"></param><returns></returns>
    public T Single(Func<T, bool> exp)
    {
        return GetTable.Single(exp);
    }

    /// <summary>See _vertexRepository.</summary>
    /// <param name="exp"></param><returns></returns>
    public T First(Func<T, bool> exp)
    {
        return GetTable.First(exp);
    }

    /// <summary>See _vertexRepository.</summary>
    /// <param name="entity"></param>
    public virtual void MarkForDeletion(T entity)
    {
        _dataContextFactory.Context.GetTable<T>().DeleteOnSubmit(entity);        
    }

    /// <summary>
    /// Create a new instance of type T.
    /// </summary>
    /// <returns></returns>
    public virtual T CreateInstance()
    {
        T entity = Activator.CreateInstance<T>();
        GetTable.InsertOnSubmit(entity);
        return entity;
    }

    /// <summary>See _vertexRepository.</summary>
    public void SaveAll()
    {
        _dataContextFactory.SaveAll();
    }

    public Repository(IDataContextFactory dataContextFactory)
    {
        _dataContextFactory = dataContextFactory;
    }
    
    #region Properties

    private string PrimaryKeyName
    {
        get { return TableMetadata.RowType.IdentityMembers[0].Name; }
    }

    private System.Data.Linq.Table<T> GetTable
    {
        get { return _dataContextFactory.Context.GetTable<T>(); }
    }

    private System.Data.Linq.Mapping.MetaTable TableMetadata
    {
        get { return _dataContextFactory.Context.Mapping.GetTable(typeof(T)); }
    }

    private System.Data.Linq.Mapping.MetaType ClassMetadata
    {
        get { return _dataContextFactory.Context.Mapping.GetMetaType(typeof(T)); }
    }

    #endregion
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

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

Share

About the Author

liammclennan
Web Developer
Australia Australia
Liam McLennan has been developing for the internet since 2001. He is passionate about delivering top quality I.T. solutions that address his customer's needs.

You may also be interested in...

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150731.1 | Last Updated 5 Jun 2008
Article Copyright 2008 by liammclennan
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid