使用SQL缓存来减少对INFORMATION_SCHEMA.COLUMNS视图的调用次数。可以通过以下代码示例实现:
public class MyDbInitializer : CreateDatabaseIfNotExists
{
protected override void Seed(ApplicationDbContext context)
{
// Cache the results of Information_Schema.Columns view for 1 hour
context.Database.ExecuteSqlCommand(
@"
IF OBJECT_ID('TempInfoSchemaCache', 'U') IS NOT NULL
DROP TABLE TempInfoSchemaCache;
SELECT *
INTO TempInfoSchemaCache
FROM INFORMATION_SCHEMA.COLUMNS
WITH (NOLOCK);
IF NOT EXISTS(SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('TempInfoSchemaCache') AND name = 'IndexName')
CREATE CLUSTERED INDEX [IndexName] ON TempInfoSchemaCache([TABLE_CATALOG], [TABLE_SCHEMA], [TABLE_NAME]);
SELECT COUNT(*) FROM TempInfoSchemaCache;
");
base.Seed(context);
}
}
在这个例子中,我们使用CreateDatabaseIfNotExists类和Seed方法来在应用程序启动时创建数据库。Seed方法执行了以下步骤:
然后,我们可以使用以下代码示例从TempInfoSchemaCache表中查询列信息:
public class MyController : Controller
{
private readonly ApplicationDbContext _context;
public MyController(ApplicationDbContext context)
{
_context = context;
}
public ActionResult Index()
{
var cache = _context.Database.SqlQuery(
@"SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM TempInfoSchemaCache
WHERE TABLE_NAME = 'MyTable'
");
// Do something with cache
return View();