gpt4 book ai didi

Linq to NHibernate 在一次请求中生成 3,000 多个 SQL 语句!

转载 作者:行者123 更新时间:2023-12-02 09:01:10 25 4
gpt4 key购买 nike

过去几个月我一直在使用 Linq to NHibernate 开发一个 Web 应用程序,但直到现在才分析它生成的 SQL。使用 NH Profiler,现在看来,当执行 Linq 表达式时,以下代码块访问数据库的次数超过 3,000 次。

        var activeCaseList = from c in UserRepository.GetCasesByProjectManagerID(consultantId)
where c.CompletionDate == null
select new { c.PropertyID, c.Reference, c.Property.Address, DaysOld = DateTime.Now.Subtract(c.CreationDate).Days, JobValue = String.Format("£{0:0,0}", c.JobValue), c.CurrentStatus };

存储库方法如下所示:

    public IEnumerable<Case> GetCasesByProjectManagerID(int projectManagerId)
{
return from c in Session.Linq<Case>()
where c.ProjectManagerID == projectManagerId
select c;
}

它似乎首先运行初始存储库查询,然后迭代所有结果检查以查看 CompletionDate 是否为空,但首先发出查询以获取 c.Property.Address。

因此,如果初始查询返回 2,000 条记录,即使其中只有 5 条记录没有 CompletionDate,它仍然会触发 SQL 查询以返回 2,000 条记录的地址详细信息。

我想象的工作方式是,它将评估所有 WHERE 和 SELECT 子句并简单地将它们合并,因此初始查询将如下所示:

选择 ... WHERE ProjectManager = @p1 AND CompleteDate 不为空

这将产生 5 条记录,然后它可以触发另外 5 个查询来获取地址。我在这里期待太多,还是我只是做错了什么?

安东尼

最佳答案

更改 GetCasesByProjectManagerID 的声明:

public IQueryable<Case> GetCasesByProjectManagerID(int projectManagerId)

您无法使用 IEnumerable<T> 编写查询- 它们只是序列。 IQueryable<T>专为此类构图而设计。

关于Linq to NHibernate 在一次请求中生成 3,000 多个 SQL 语句!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1166357/

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