如何加快从多个表中提取单个对象的查询?

时间:2014-01-23 21:09:00

标签: c# sql .net performance entity-framework

如何加快基于密钥获取多个对象的查询?

例如(原谅我做出的例子),我说SQL Server中有多个表 Paper Document File 。每个文件记录都有一个文件" parent"每个文件记录都有一篇论文"父母"。一篇论文可能有多个文档,因此最终会有多个与该论文相关的文件。

论文表


int Paper_Key - PK

varchar Paper_Name

文件表


int Document_Key - PK

int Paper_Key

varchar Doc_Name

文件表


int File_Key - PK

int Document_Key

从文件级别来说,我们要检索文档和与特定文件关联的文件(所有这些表中都有数百万行)。

我最初的想法是将我的工作单元模式与我的通用存储库一起使用,并按键顺序检索每条记录。

服务方法

public MyViewModel GetFileWithDetails(int fileId)
{
    File file = _unitOfWork.FileRepository.GetById(fileId);
    Document doc = _unitOfWork.DocumentRepository.GetById(file.Document_Key);
    Paper paper = _unitOfWork.PaperRepository.GetById(doc.Paper_Key);

    var model = new MyViewModel
    {
        FileKey = file.File_Key,
        // etc etc
    }

    return model;
}

通用存储库方法

internal MyDBEntities context;
internal DbSet<TEntity> dbSet;

public GenericRepository(MyDBEntities context)
{
    this.context = context;
    this.dbSet = context.Set<TEntity>();
}

public TEntity GetById(object id)
{
    return dbSet.Find(id);
}

有没有办法更快地执行此查询?我对大多数其他页面使用相同的模式(详细信息,列表),但是从多个表中选择似乎需要更多的指数 - 特别是因为每个查询都必须等待前一个结果能够执行。

修改 遗憾的是,表之间没有关系。只有钥匙。我要求绘制关系,但由于空值或某些东西,SQL不允许.....我不负责表格。

2 个答案:

答案 0 :(得分:1)

使用Include方法执行连接多个表的单个查询。

没有人说存储库不能考虑其他数据类型,只需选择中心对象并将该方法放在继承通用基础存储库的存储库中。

答案 1 :(得分:0)

尝试使用.Include带回相关实体。