August 2007 - Posts

I wanted to be able to cache the results of a query from the LinqDataSource that was used in multiple places on the page.  I whipped up this little class to do the work of caching for me.  The class, LinqCacheDataSource, handles the Selecting and Selected events.  The Selected handler inserts the result of the query into cache.  The Selecting handler gets the result from the cache.  If it doesn't find the result, the query runs as normal.  The caching will only work for selecting data.  It works great for dropdowns and other fairly static data.

The Code ...

/// <summary>

/// A LinqDataSource that provides caching for Linq queries.

/// </summary>

public class LinqCacheDataSource : LinqDataSource

{

    /// <summary>

    /// Initializes a new instance of the <see cref="LinqCacheDataSource"/> class.

    /// </summary>

    public LinqCacheDataSource()

        : base()

    {

        this.Selecting += new EventHandler<LinqDataSourceSelectEventArgs>(OnSelecting);

        this.Selected += new EventHandler<LinqDataSourceStatusEventArgs>(OnSelected);

    }

 

    private void OnSelecting(object sender, LinqDataSourceSelectEventArgs e)

    {

        if (!EnableCache)

            return;

 

        string key = GetKey();

        object source = Context.Cache[key];

        if (source == null)

            return;

 

        Debug.WriteLine("Cache Hit: " + key);

        e.Result = source;

    }

 

    private void OnSelected(object sender, LinqDataSourceStatusEventArgs e)

    {

        if (!EnableCache)

            return;

 

        if (e.Exception != null || e.Result == null)

            return;

 

        string key = GetKey();

        object source = Context.Cache[key];

        if (source != null)

            return;

 

        Debug.WriteLine("Cache Insert: " + key);

        Context.Cache.Insert(key, e.Result, null,

            DateTime.Now.AddSeconds(Duration), Cache.NoSlidingExpiration);

    }

 

    private string GetKey()

    {

        StringBuilder sb = new StringBuilder();

        sb.Append(this.ContextTypeName);

        sb.Append(" from ");

        sb.Append(this.TableName);

 

        if (!string.IsNullOrEmpty(this.Select))

        {

            sb.Append(" select ");

            sb.Append(this.Select);

        }

        if (!string.IsNullOrEmpty(this.Where))

        {

            sb.Append(" where ");

            sb.Append(this.Where);

        }

        if (!string.IsNullOrEmpty(this.OrderBy))

        {

            sb.Append(" OrderBy ");

            sb.Append(this.OrderBy);

        }

        return sb.ToString();

    }

 

    /// <summary>

    /// Gets or sets a value indicating whether query caching is enabled.

    /// </summary>

    [DefaultValue(true)]

    [Category("Cache")]

    [Description("Enable caching the linq query result.")]

    public bool EnableCache

    {

        get

        {

            object result = this.ViewState["EnableCache"];

            if (result != null)

                return (bool)result;

 

            return true;

        }

        set

        {

            this.ViewState["EnableCache"] = value;

        }

    }

 

    /// <summary>

    /// Gets or sets the time, in seconds, that the query is cached.

    /// </summary>

    [DefaultValue(30)]

    [Category("Cache")]

    [Description("The time, in seconds, that the query is cached.")]

    public int Duration

    {

        get

        {

            object result = this.ViewState["Duration"];

            if (result != null)

                return (int)result;

 

            return 30;

        }

        set

        {

            this.ViewState["Duration"] = value;

        }

    }

}

 

with 4 comment(s)
Filed under: ,

PLINQO, which stands for Professional LINQ to Objects, is a collection of CodeSmith templates that are meant to replace and extend the LINQ to SQL designers that are included with Visual Studio 2008.

Features

  • Generate or update a LINQ to SQL dbml file from a database schema.
    • Includes all tables, stored procedures, functions, and views with the ability to exclude objects based on regex patterns.
    • Ability to automatically remove object prefix and suffixes (ie. tbl_ and usp_).
    • Dbml file can still be customized with the normal Visual Studio 2008 designer.
    • Dbml file can be refreshed based on the current database schema without losing customizations. (See Safe Attributes)
  • Generation of the LINQ to SQL DataContext class.
  • Generation of the LINQ to SQL entity classes.
    • Generates one file per entity instead of one massive file.
    • Generates partial classes where custom code can be written and won't be overwritten.
    • Generated entity files are added to the project as code behind files to their corresponding custom entity files.
  • Generation of entity manager classes.
    • Adds customizable business rules engine to enforce entity validation, business and security rules.
    • Provides access to common queries based on primary keys, foreign keys, and indexes.
    • Common queries are exposed as IQueryable so they can be extended.
  • All templates can be customized to meet your needs.

Read More

http://community.codesmithtools.com/blogs/pwelter/archive/2007/08/08/plinqo.aspx

Download 

http://www.codeplex.com/codesmith/Release/ProjectReleases.aspx 

with 10 comment(s)
Filed under: , ,
More Posts