首次尝试预编译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)
给出了以下错误:
我正在使用this tutorial来加速Linq查询。
答案 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
);
}