gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:09:34 26 4
gpt4 key购买 nike

我想计算相关表的行:

MainTable tbl = tblInfo(id);
var count = tbl.Related_Huge_Table_Data.Count();

问题是:这需要很长时间(大约 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;
}

我使用了 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();
}

如果您坚持使用父端方法,您也可以这样做:

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

如果你想在像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();
}

关于c# - 优化在 Sql server 中快速运行的 LINQ 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42186893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com