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生成.
通过运行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
.因此,无论传球MyDataContext
到tblInfo
或使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)
归档时间: |
|
查看次数: |
1480 次 |
最近记录: |