如何使用预编译的Linq查询

时间:2014-01-08 18:23:45

标签: performance linq entity-framework linq-to-sql

首次尝试预编译linq查询,看起来我做错了。

我想在验证器查询中使用预编译查询,每次使用最多会调用14k次。我想在构造函数中实例化查询(再次,第一次使用这些,所以不确定这是否正确使用)所以类对象将能够调用编译的查询。

以下是Func作为属性并在构造函数

中实例化
    private static Func<DataContext, ZipCodeTerritory, IQueryable<ZipCodeTerritory>> SearchEffectiveDate;
    public ZipCodeValidatorCompiled()
    {
        SearchEffectiveDate = CompiledQuery.Compile((DataContext db, ZipCodeTerritory zipCode)
        =>
        from z in db.GetTable<ZipCodeTerritory>()
        where z.DrmTerrDesc.Equals(zipCode.DrmTerrDesc) &&
              z.IndDistrnId.Equals(zipCode.IndDistrnId) &&
              z.StateCode.Equals(zipCode.StateCode) &&
              (z.ZipCode.Equals(null) ? z.ZipCode.Equals(null) : z.ZipCode.Equals(zipCode.ZipCode))
        select z
        );
    }

以下是其中一种验证方法

的调用方法
    private static string ValidateEffectiveDate(ZipCodeTerritory zipCode)
    {
        using (var _db = new AgentResources())
        {
            IQueryable<ZipCodeTerritory> terrList = SearchEffectiveDate(_db, zipCode);

            foreach (var zip in terrList)
            {
                if (zip.EffectiveDate >= zipCode.EndDate)
                {
                    return
                        "End Date must be greater than Effective Date of any other record sharing the same DRM Territory Description, Territory, State and Zip Code; ";
                }
            }                
        }

        return null;
    }

我遇到的问题是在验证方法中使用此语句

IQueryable<ZipCodeTerritory> terrList = SearchEffectiveDate(_db, zipCode);

Visual Studio SearchEffectiveDate(_db, zipCode)给出了以下错误:

  • 错误20委托'System.Func&gt;'有一些无效的论点
  • 错误21参数1:无法从'Monet.Models.AgentResources'转换为'System.Data.Linq.DataContext'

我正在使用this tutorial来加速Linq查询。

1 个答案:

答案 0 :(得分:0)

这里的问题是我没有使用DataContext对象,而是使用类型DbContext的{​​{1}}对象。通过将静态AgentResoources对象作为参数添加到类中并在构造函数中实例化,使用标准连接字符串,就像使用DataContext ojbect一样,我能够编译代码。

<强>参数/构造

SqlConnection

方式

    private static Func<DataContext, ZipCodeTerritory, IQueryable<ZipCodeTerritory>> SearchEffectiveDate;
    private static DataContext _dbContext;
    public ZipCodeValidatorCompiled()
    {
        _dbContext = new DataContext(ConfigurationManager.AppSettings.Get("db"));
        SearchEffectiveDate = CompiledQuery.Compile((DataContext db, ZipCodeTerritory zipCode)
        =>
        from z in db.GetTable<ZipCodeTerritory>()
        where z.DrmTerrDesc.Equals(zipCode.DrmTerrDesc) &&
              z.IndDistrnId.Equals(zipCode.IndDistrnId) &&
              z.StateCode.Equals(zipCode.StateCode) &&
              (z.ZipCode.Equals(null) ? z.ZipCode.Equals(null) : z.ZipCode.Equals(zipCode.ZipCode))
        select z
        );
    }