优化在Sql server中快速运行的LINQ查询?

J.P*_*J.P 13 c# linq sql-server linq-to-sql

我想计算相关表的行:

MainTable tbl = tblInfo(id);
var count = tbl.Related_Huge_Table_Data.Count();
Run Code Online (Sandbox Code Playgroud)

问题是:这需要太长时间(大约20秒)才能执行,尽管当我在Sql Server中运行此查询时,它执行时间不到一秒钟.如何在linq中优化此查询?我也试过使用存储过程,但没有运气.

这是tblInfo方法:

public MainTable tblInfo(int id)
{
    MyDataContext context = new MyDataContext();
    MainTable mt = (from c in context.MainTables
                    where c.Id == id
                    select c).SingleOrDefault();
    return mt;
}
Run Code Online (Sandbox Code Playgroud)

我使用LinqToSql,类由LinqToSql生成.

GSe*_*erg 9

通过运行SingleOrDefault()您执行查询并在此之后必须处理内存中的结果.您需要保持不变,IQueryable直到您的查询完全构建.

回答"父记录有多少个子记录"的最简单方法是从子方面接近它:

using (var dx = new MyDataContext())
{
    // If you have an association between the tables defined in the context
    int count = dx.Related_Huge_Table_Datas.Where(t => t.MainTable.id == 42).Count();

    // If you don't
    int count = dx.Related_Huge_Table_Datas.Where(t => t.parent_id == 42).Count();
}
Run Code Online (Sandbox Code Playgroud)

如果你坚持父方方法,你也可以这样做:

using (var dx = new MyDataContext())
{
    int count = dx.MainTables.Where(t => t.id == 42).SelectMany(t => t.Related_Huge_Table_Datas).Count();
}
Run Code Online (Sandbox Code Playgroud)

如果你想在一个函数中保留这个查询的一部分tblInfo,你可以,但你不能MyDataContext从这个函数内部实例化,否则你会在尝试将查询与另一个实例一起使用时得到异常MyDataContext.因此,无论传球MyDataContexttblInfo或使tblInfo的一员partial class MyDataContext:

public static IQueryable<MainTable> tblInfo(MyDataContext dx, int id)
{
    return dx.MainTables.Where(t => t.id == id);
}

...

using (var dx = new MyDataContext())
{
    int count = tblInfo(dx, 42).SelectMany(t => t.Related_Huge_Table_Datas).Count();
}
Run Code Online (Sandbox Code Playgroud)

  • @ user5032790在分析器中启动跟踪,并在执行`Count()`时查看服务器上的查询.我看起来很合理. (3认同)