c# - 一对多投影 LINQ 查询重复执行

标签 c# performance linq-to-sql

我正在将 LINQ to SQL 结果投影到强类型类:Parent 和 Child。这两个查询之间的性能差异很大:

慢速查询 - 来自 DataContext 的日志显示正在为每个父级单独调用数据库

var q = from p in parenttable
        select new Parent()
        {
            id = p.id,
            Children = (from c in childtable
                        where c.parentid = p.id
                        select c).ToList()
        }
return q.ToList()  //SLOW

快速查询 - 来自 DataContext 的日志记录显示返回所有必需数据的单个数据库命中查询

var q = from p in parenttable
        select new Parent()
        {
            id = p.id,
            Children = from c in childtable
                        where c.parentid = p.id
                        select c
        }
return q.ToList()  //FAST

我想强制 LINQ 使用第二个示例的单一查询样式,但直接用它们的子对象填充父类。否则,Children 属性是一个 IQuerierable<Child>必须查询才能公开 Child 对象。

所引用的问题似乎没有解决我的情况。使用 db.LoadOptions 不起作用。也许它要求类型是在 DataContext 中注册的 TEntity。

   DataLoadOptions options = new DataLoadOptions();
   options.LoadWith<Parent>(p => p.Children);
   db.LoadOptions = options;

请注意:Parent 和 Child 是简单类型,而不是 Table<TEntity>类型。 Parent 和 Child 之间没有上下文关系。子查询是临时的。

问题的关键:在第二个 LINQ 示例中,我实现了 IQueriable语句,不要调用 ToList()函数,出于某种原因,LINQ 知道如何生成一个查询来检索所有需要的数据。我如何使用第一个查询中完成的实际数据填充我的临时投影?另外,如果有人可以帮助我更好地表述我的问题,我将不胜感激。

最佳答案

请务必记住,LINQ 查询依赖于延迟执行。在您的第二个查询中,您实际上并没有获取有关 child 的任何信息。您已经创建了查询,但还没有实际执行它们来获取这些查询的结果。如果您要迭代列表,然后迭代每个项目的 Children 集合,您会发现它花费的时间与第一个查询一样多。

您的查询本身也非常低效。您正在使用嵌套查询来表示 Join 关系。如果您使用 Join 代替,查询将能够由查询提供程序和数据库适当优化以更快地执行。您可能还需要调整数据库的索引以提高性能。以下是连接的外观:

var q = from p in parenttable
        join child in childtable
        on p.id equals child.parentid into children
        select new Parent()
        {
            id = p.id,
            Children = children.ToList(),
        }
return q.ToList()  //SLOW

关于c# - 一对多投影 LINQ 查询重复执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16240360/

相关文章:

c# - 如果字符串包含特定字符则数据触发

c# - Moq - 异步方法的设置。错误

java - 为这种情况动态生成线程 Java

javascript - 如何优化/加速 Vue JS 应用程序中的自动搜索?

sql - 查询 250k 行需要 53 秒

Linq-to-Sql 计数

linq-to-sql - Linq to sql : Order by datetime desc, 然后按时间部分数据asc排序?

c# - 具有保留 IP 的 WCF 工作线程是否在 Azure 上使用不同的出站 IP?

c# - 发布错误 : Could not load file or assembly 'Microsoft.Web.XmlTransform' , Version=1.4.0.0, Culture=neutral 等或其依赖项之一

java - 将变量声明为最终的内部方法会提高性能吗?